理解Flutter的ValueKey

问题描述 投票:0回答:1

在我的 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");
  }
}
flutter widget
1个回答
0
投票

这是因为您不再使用

const
构造函数。 Flutter 有一个优化,如果一个 widget 在重建之间“相同”(不是“相等”),它将短路重建子树。如果你只删除 const 而不添加键,你会看到同样的事情发生:新的 Widget 实例不相同,因此 Flutter 使用键将现有的 State 实例与新的 Widget 实例链接起来,调用 didUpdateWidget
每个状态,然后重建树。
    
	
© www.soinside.com 2019 - 2024. All rights reserved.