class ChildWidget extends StatefulWidget {
@override
_ChildWidgetState createState() => _ChildWidgetState();
}
class _ChildWidgetState extends State<ChildWidget> {
@override
Widget build(BuildContext context) {
return new Text(FatherWidget.getData(context).data.toString());
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
//父或祖先widget中的InheritedWidget改变(updateShouldNotify返回true)时会被调用
//如果build中没有依赖InheritedWidget,则此回调不会被调用
print("didChangeDependencies = " +
FatherWidget.getData(context).data.toString());
}
}
//子树通过该方法获取共享数据
static FatherWidget getData(BuildContext context) {
return context.inheritFromWidgetOfExactType(FatherWidget);
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
int count = 0;
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'title',
home: new Scaffold(
appBar: new AppBar(
title: new Text('title'),
),
body: new Center(
child: FatherWidget(
data: count,
child: new Column(
children: <Widget>[
ChildWidget(),
new FloatingActionButton(onPressed: _changeCount,child: new Icon(Icons.adjust),),
],
),
),
),
),
);
}
_changeCount() {
setState(() {
++count;
print('mCount == ' + count.toString());
});
}
}
最后需要注意一点,上面说到的依赖前提是两个组件是父、子的关系,我试了一下,如果FatherWidget中没有ChildWidget,只是单纯的使用了FatherWidget的数据的话,是不会触发didChangeDependencies回调的!!!