重建时未调用 initState()

initState() not called on rebuild

我的构建方法是这样的:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      body: new NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              someWidget()
            ];
          },
          controller: _scrollController,
          body: Column(children: [
            Expanded(
              child: Container(
                  child: (_input.length == 0
                      ? Center(child: Text('Lädt...'))
                      : MyCoolWidget(_input)
                ),
            ))
          ])),
    );
  }

现在在运行时有时会调用此方法:

void setInput(List<String> input) {
    setState(() {
      _input = input;
    });
}

这改变了 input。现在我想让 MyCoolWidget 重建,因为小部件依赖于此 input。所以我在setState中调用它。我检查并重建了构建方法,但我看不到正确的更改。

这是因为我的MyCoolWidgets initState没有被再次调用。但是我根据 input 计算重要的事情。 Widget Lifecycle 中是否有一种方法可以为此目的而覆盖并在重建时被调用?

就像在 initState 和从 setState 调用 build 方法之间的某个地方:

图片来自:https://www.developerlibs.com/2019/12/flutter-lifecycle-widgets.html

感谢任何建议。

编辑: 我现在自己做了一个解决方法。我向 MyCoolWidget 添加了一个我可以设置的标志。此标志指示我是否需要重新计算我通常在 initState 中执行的操作。当调用 build()-Method 时,我检查是否设置了此标志并决定是否重新计算。

但也许有更好的解决方案来解决我的问题。

您正在寻找 didUpdateWidget。来自 official documentation on this method:

Called whenever the widget configuration changes.

Override this method to respond when the widget changes (e.g., to start implicit animations).

The framework always calls build after calling didUpdateWidget, which means any calls to setState in didUpdateWidget are redundant.

在您的情况下,您可以看到,只要您的小部件从其构造函数接收的对象发生变化,框架就会调用此方法。它还为您提供 oldWidget 的值,因此您可以有条件地更新您需要的任何内容。

你可以覆盖这个方法来实现当你的input改变时你想做的改变,Flutter会在setState里面的input改变时调用这个方法父小部件。