重建时未调用 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
中调用它。我检查并重建了构建方法,但我看不到正确的更改。
这是因为我的MyCoolWidget
s 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
改变时调用这个方法父小部件。
我的构建方法是这样的:
@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
中调用它。我检查并重建了构建方法,但我看不到正确的更改。
这是因为我的MyCoolWidget
s 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
改变时调用这个方法父小部件。