在我的 Flutter 应用程序中的某个位置,我有一个小部件,其构建方法中包含此内容:
Stack(children: _loadTestWidgets())
调用setState时,如果
_loadTestWidgets
方法如下:
List<TestWidget> _loadTestWidgets() {
return [
const TestWidget("1"),
const TestWidget("2"),
const TestWidget("3")
];
}
我的 TestWidget 未按预期重建。如果我这样更新
_loadTestWidgets
方法:
List<TestWidget> _loadTestWidgets() {
List<TestWidget> result = [];
for (int i = 0; i < 3; i++) {
result.add(TestWidget(key: ValueKey<String>("test-widget-$i"), "$i"));
}
return result;
}
我的小部件会在每次 setState 调用时重建。这是为什么? ValueKey 不应该阻止它们被重建吗?如果我向整个 Stack 小部件添加一个键,行为是相同的。
这是 TestWidget 类:
class TestWidget extends StatefulWidget {
final String datasetId;
const TestWidget(this.datasetId, {super.key});
@override
State<StatefulWidget> createState() { return TestWidgetState(); }
}
class TestWidgetState extends State<TestWidget> {
static final log = Logger('TestWidgetState');
@override
Widget build(BuildContext context) {
log.info("build");
return const Text("hello");
}
}
这是因为您不再使用
const
构造函数。 Flutter 有一个优化,如果一个 widget 在重建之间“相同”(不是“相等”),它将短路重建子树。如果你只删除 const
而不添加键,你会看到同样的事情发生:新的 Widget 实例不相同,因此 Flutter 使用键将现有的 State 实例与新的 Widget 实例链接起来,调用 didUpdateWidget
每个状态,然后重建树。