# 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;
}
然後就可以了!!