【问题标题】:initState() not called on rebuild重建时未调用 initState()
【发布时间】:2021-06-10 14:35:45
【问题描述】:

我的构建方法是这样的:

@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。我检查了构建方法 get 的重新构建,但我看不到正确的更改。

这是因为我的MyCoolWidgets initState 没有被再次调用。但是我根据input 计算重要的事情。 Widget 生命周期中是否有为此目的而覆盖的方法,该方法在重建时被调用?

就像介于 initState 和从 setState 调用 build 方法之间的某处:

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

感谢您的建议。

编辑: 我现在自己做了一个解决方法。我向MyCoolWidget 添加了一个可以设置的标志。这个标志表明我是否需要重新计算我通常在initState 中所做的事情。当build()-Method 被调用时,我检查是否设置了这个标志并决定是否重新计算。

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

【问题讨论】:

  • initState 在小部件生命周期开始时调用一次。如果需要在 build() 之前计算值,可以考虑覆盖 didChangeDependencies。
  • @CbL 是啊..问题是,didChangeDependenciessetState 之后没有被调用
  • 试图覆盖State.didUpdateWidget?
  • 那就奇怪了。状态改变时调用 didChangeDependencies。如果调用 setstate,则应更改状态。 api.flutter.dev/flutter/widgets/State/…

标签: flutter dart flutter-widget


【解决方案1】:

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

在小部件配置更改时调用。

重写此方法以在小部件更改时做出响应(例如, 开始隐式动画)。

框架总是在调用 didUpdateWidget 之后调用 build,这 意味着在 didUpdateWidget 中对 setState 的任何调用都是多余的。

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

你可以重写这个方法来实现当你的input改变时你想要做的改变,并且每当input在父widget的setState内改变时,Flutter就会调用这个方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2019-04-21
    • 2023-01-11
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多