InheritedWidget是Flutter中非常重要的一個功能型組件,它提供了一種數(shù)據(jù)在widget樹中從上到下傳遞、共享的方式,比如我們在應(yīng)用的根widget中通過InheritedWidget共享了一個數(shù)據(jù),那么我們便可以在任意子widget中來獲取該共享的數(shù)據(jù)!這個特性在一些需要在widget樹中共享數(shù)據(jù)的場景中非常方便!如Flutter SDK中正是通過InheritedWidget來共享應(yīng)用主題(Theme)和Locale (當(dāng)前語言環(huán)境)信息的。
/// 自定義共享數(shù)據(jù)結(jié)構(gòu)
class DataInheritedWidget extends InheritedWidget {
DataInheritedWidget({@required this.data, @required Widget child})
: super(child: child);
int data = 0;
static DataInheritedWidget getData(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<DataInheritedWidget>();
}
@override
bool updateShouldNotify(covariant DataInheritedWidget oldWidget) {
return oldWidget.data != this.data;
}
}
/// @description 作用:
/// @date: 2021/6/25
/// @author:lrs
class InheritedWidgetL extends StatefulWidget {
InheritedWidgetL({Key key}) : super(key: key);
@override
_InheritedWidgetLState createState() => _InheritedWidgetLState();
}
class _InheritedWidgetLState extends State<InheritedWidgetL> {
int number = 1;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("InheritedWidget"),
),
//---------------------最外層使用組件------------------------
body: DataInheritedWidget(
data: number,
child: ChildView(),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
setState(() {
number++;
});
}),
);
}
}
class ChildView extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _ChildView();
}
}
class _ChildView extends State<ChildView> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
print("Dependencies change --數(shù)據(jù)更新");
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text(
//----------顯示最上層共享數(shù)據(jù)-------------
DataInheritedWidget.getData(context).data.toString(),
style: TextStyle(fontSize: 20),
),
),
);
}
}

QQ錄屏20210707092218202177922424.gif
apk下載地址
https://www.pgyer.com/IUVS