在阅读了文档here和State
生命周期here之后,我仍然不确定didChangeDependencies
的工作方式。
据我了解,它将在initState
之后和InheritedWidget
中进行任何更改后触发,但是这些更改是什么?我认为了解触发didChangeDependencies
的更改很重要,这样我们才能了解何时以及如何正确使用它。
答案 0 :(得分:1)
当Flutter调用updateShouldNotify()并返回true
时,先前在build()
中请求继承的窗口小部件的窗口小部件将被调用didChangeDependencies
来通知。
updateShouldNotify
自上次被调用以来状态改变,应返回true
。
答案 1 :(得分:0)
didChangeDependencies()
在此[State]对象的依存关系更改时调用。
因此,正如上面的定义一样,如何调用?,看起来状态更改后它会被调用,但是我们如何知道状态更改了呢?
例:
以下示例使用提供者状态管理机制从父窗口小部件更新子窗口小部件。 Provider具有一个名为updateShouldNotify的属性,该属性决定状态是否已更改。如果返回true,则在ChildWidget类中仅调用didChangeDependencies。
默认情况下,updateShouldNotify在内部默认情况下返回true,因为它知道状态已更改。
我们为什么需要updateShouldNotify?
这是必需的,因为如果有人想在特定条件下更新状态。例如:如果用户界面只需要显示偶数,那么我们可以添加条件
updateShouldNotify: (oldValue, newValue) => newValue % 2 == 0,
代码段:
class ParentWidget extends StatefulWidget {
ParentWidget({Key key, this.title}) : super(key: key);
final String title;
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Life Cycle'),
),
body: Provider.value(
value: _counter,
updateShouldNotify: (oldValue, newValue) => true,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Press Fab button to increase counter:',
),
ChildWidget()
],
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
class ChildWidget extends StatefulWidget {
@override
_ChildWidgetState createState() => _ChildWidgetState();
}
class _ChildWidgetState extends State<ChildWidget> {
int _counter = 0;
@override
void initState() {
print('initState(), counter = $_counter');
super.initState();
}
@override
void didChangeDependencies() {
_counter = Provider.of<int>(context);
print('didChangeDependencies(), counter = $_counter');
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
print('build(), counter = $_counter');
return Text(
'$_counter',
);
}
}
输出日志:
I/flutter ( 3779): didChangeDependencies(), counter = 1
I/flutter ( 3779): build(), counter = 1
有关更多信息:
https://medium.com/@jitsm555/differentiate-between-didchangedependencies-and-initstate-f98a8ae43164