# Flutter | 子元件之間共用變數 ###### tags: `flutter` 小小今天遇到因為懶惰所以跑出bug的情況 bug是這樣: 好幾個元件之間要使用同個變數,於是懶惰的小小直接用了全域變數,就是這個全域變數,導致在原本的父元件dispose之後,新的父元件也build之後有了錯誤,而錯誤就是畫面上的資料是原本的父元件才有的資料(這邊使用了fetch API 所以會有延遲)。 簡單來說就是報應,沒有考慮到不同的父元件之間共用全域變數會有的後果,在只有一個父元件會被創建時是沒問題的,如果確實的等fetch結束也不會有問題,但事實就是它有問題了(舊的元件在執行動作時刪除,然後載入新的元件時) *sad face* 於是不想使用GlobalKey的小小想到了一個新的方法,如果使用的是object會不會就可以在不同的子元件之間傳遞,只要在父元件創建時放值進去的話?? 程式碼概念如下 import 'package:flutter/material.dart'; const Color darkBlue = Color.fromARGB(255, 18, 32, 47); void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData.dark().copyWith( scaffoldBackgroundColor: darkBlue, ), debugShowCheckedModeBanner: false, home: Scaffold( body: Center( child: ParentWidget(), ), ), ); } } class ParentWidget extends StatelessWidget { SharedVar sharedVar = SharedVar(); @override Widget build(BuildContext context) { return Column( children:[ ChildA(sharedVar), ChildB(sharedVar), ]); } } class ChildA extends StatefulWidget{ SharedVar variable; ChildA(this.variable); @override State<StatefulWidget> createState() { return ChildAState(); } } class ChildAState extends State<ChildA>{ @override Widget build(BuildContext context) { return GestureDetector( onTap:(){ setState((){ widget.variable.num++; }); }, child:Text("${widget.variable.num}"), ); } } class ChildB extends StatefulWidget{ SharedVar variable; ChildB(this.variable); @override State<StatefulWidget> createState() { return ChildBState(); } } class ChildBState extends State<ChildB>{ @override Widget build(BuildContext context) { return GestureDetector( onTap:(){ setState((){ widget.variable.num++; }); }, child:Text("${widget.variable.num}"), ); } } class SharedVar{ int num = 0; } 然後就可以了!!