了解Flutter didChangeDependencies机制

时间:2019-02-12 01:51:20

标签: flutter

在阅读了文档hereState生命周期here之后,我仍然不确定didChangeDependencies的工作方式。

据我了解,它将在initState之后和InheritedWidget中进行任何更改后触发,但是这些更改是什么?我认为了解触发didChangeDependencies的更改很重要,这样我们才能了解何时以及如何正确使用它。

2 个答案:

答案 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