InteritedWidget说明
InheritedWidget是Flutter中非常重要的一个功能型组件,它提供了一种在Widget树中从上到下共享数据的方式,比如我们在一个应用的根Widget中通过InheritedWidget共享了一个数据,那么在这个应用的任意一个子Widget中都可以获取到该数据!在Flutter中的应用主题Theme和当前语言Locale正是通过InheritedWidget来共享信息的;
state生命周期之didChangeDependencies
State对象的didChangeDependencies回调方法,它会在依赖发生改变时被Flutter框架调用。这个"依赖"指的是子Widget是否使用了父Widget中InheritedWidget的数据!
如果使用了,则代表有依赖关系,否则没有依赖关系;这种机制可以使子组件在所依赖的InheritedWidget发生变化是来更新自身!
代码片段
class Counter extends InheritedWidget {
const Counter({Key? key, required this.child, required this.counter})
: super(key: key, child: child);
final int counter;
final Widget child;
// 获取注册的Counter
static Counter? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<Counter>();
}
// 通知子widget是否更新
bool updateShouldNotify(covariant Counter oldWidget) {
return oldWidget.counter != counter;
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Widget build(BuildContext context) {
return Counter(
counter: _counter,
child: Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[
Text(
'You have pushed the button this many times:',
),
CounterA(),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
));
}
}
class CounterA extends StatefulWidget {
const CounterA({Key? key}) : super(key: key);
_CounterAState createState() => _CounterAState();
}
class _CounterAState extends State<CounterA> {
void didChangeDependencies() {
super.didChangeDependencies();
print('父状态刷新了');
}
Widget build(BuildContext context) {
print('build执行了');
return Text(
'${context.dependOnInheritedWidgetOfExactType<Counter>()?.counter}',
style: Theme.of(context).textTheme.headline4,
);
}
}
总结:
didChangeDependencies会在启动时执行一次,子widget依赖了父widget的InheritedWidget
InheritedWidget状态改变调用updateShouldNotify通知子widget调用didChangeDependencies更新状态。