Flutter-为什么在每次重新构建父窗口小部件时都不调用子窗口小部件的initState()?

时间:2019-02-19 06:18:13

标签: dart flutter

我有一个Parent小部件,它具有某种状态,在这种情况下为计数器。

此状态通过其构造函数传递给Child小部件。

现在,据我了解,Child应该在Parent的每次状态更改时重新构建,因为它位于build()的{​​{1}}函数中,并且每次状态更改时都会调用Parent

这个概念使我相信,每次计数器更改时都会打印build()消息。事实并非如此!

我本质上希望每当INIT STATE!的构造函数参数(Child)发生变化时才触发一次“钩子”。

有人可以解释为什么会这样吗,以及使用上述“挂钩”的正确方法是什么?

message

3 个答案:

答案 0 :(得分:3)

好吧,看来State类的文档中已经清楚提到了这一点。

正确的方法是重写didUpdateWidget子类中的State方法。

答案 1 :(得分:0)

感谢@Dev Aggarwal。

除了对Dev Aggarwal的回答外,我在此处提供了示例。

在子窗口小部件中实现didUpdateWidget()方法。当父状态发生更改时,didUpdateWidget()方法将在子窗口小部件中调用。

Implement didUpdateWidget() method in Child widget.

@override
  void didUpdateWidget(<YourChildScreen> oldWidget) {

    super.didUpdateWidget(oldWidget);

    print("oldWidget.searchTerm is ${oldWidget.searchTerm}");
    print("widget.searchTerm is ${widget.searchTerm}");

    if (oldWidget.searchTerm != widget.searchTerm) {

      this.updateChildWithParent();

    }
  }


void updateChildWithParent() {
    print("updateChildWithParent/search screen");
    setState(() {

      _mJsonLoaded = false; // For loader
      if (listArray.length > 0) {
        listArray.clear();
      }
    });

    // Do whatever you want here…
    // Like call api call again in child widget.
  }

我希望它会有用。

答案 2 :(得分:0)

initState 仅在状态首次插入小部件树时调用。稍后,由 didUpdateWidget 处理后续调用。