InheritedWidget是Flutter中非常重要的一個功能型組件,它提供了一種資料在widget樹中從上到下傳遞、共享的方式,
首先,我們通過繼承InheritedWidget,將當前計數器點擊次數保存在ShareDataWidget的data屬性中:
class ShareDataWidget extends InheritedWidget{
ShareDataWidget({
required this.data,
required Widget child
}):super(child: child);
final int data;
//定義方法,用于子樹中的widget獲取共享資料
static ShareDataWidget? of(BuildContext context) {
return context.getElementForInheritedWidgetOfExactType<ShareDataWidget>()!.widget as ShareDataWidget;
}
@override
bool updateShouldNotify(ShareDataWidget oldWidget) {
return oldWidget.data != data;
}
}
然后我們實作一個子組件_TestWidget,在其build方法中參考ShareDataWidget中的資料,
class TestWidget extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return TestWidgetState();
}
}
class TestWidgetState extends State<TestWidget>{
@override
Widget build(BuildContext context) {
return Text(ShareDataWidget.of(context)!.data.toString());
}
}
最后,我們創建一個按鈕,每點擊一次,就將ShareDataWidget的值自增:
class InheritedWidgetRoute extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return InheritedWidgetRouteState();
}
}
class InheritedWidgetRouteState extends State<InheritedWidgetRoute>{
int count = 0;
@override
Widget build(BuildContext context) {
return Center(
child: ShareDataWidget(
data: count,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
child: TestWidget(),
),
RaisedButton(
onPressed: (){
setState(() {
count++;
});
},
child: Text("點擊+1"),
),
],
),
),
);
}
}
添加到容器中
class StudyInheritedWidget extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("共享資料"),
),
body: Container(
child: InheritedWidgetRoute(),
),
);
}
}
運行

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/286817.html
標籤:區塊鏈
