UI 从 List<Widget> 移动元素后未正确更新

UI not properly updating after moving element from List<Widget>

我有一个 List<Entry> mySet,它是一个小部件列表 Entry

在父小部件中,我使用 ListView.builder 生成这些小部件。

这个父控件有两个额外的方法

addEntry() {
  setState(() {
    mySet.add(Entry(index: mySet.length));
  });
}

removeEntry(_EntryState entry) {
  int index = entry.widget.index;
  setState(() {
    mySet.removeWhere((item) => item.index == index);
  });
}

每个条目中调用这些的按钮如下所示

IconButton(
  iconSize: 25,
  icon: Icon(Icons.add),
  onPressed: index == mySet.last.index
      ? () {
          setState(() {
            pKey.currentState!.addEntry();
          });
        }
      : null),
IconButton(
  iconSize: 25,
  icon: Icon(Icons.remove),
  onPressed: isLast(() {
    setState(() {
      pKey.currentState!.removeEntry(this);
    });
  })),

还有这个函数

isLast(Function fn) => index == mySet.last.index ? fn : null;

加法和减法函数的条件相同,这只是我测试和尝试调试问题。

问题:

当我单击以添加行小部件时,前面几行的 add/remove 按钮被禁用,它们应该被禁用。

但是当我在最后一行上单击删除时,不会重新启用前一行的按钮。

然而,如果我对代码(任何东西)进行小的更改,以触发热重载,最后一行的按钮将启用。

这是我的 Listview.builder 代码,在同一个父小部件中。

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return mySet[index];
        },
        itemCount: mySet.length);
  }

有问题的用户 有类似的问题。

在你的情况下,你可以通过使用 ValueKey(property) 来解决这个问题,其中 property 是你的 Entry 对象的一个​​常见属性,你确定每个 Entry 对象都是不同的.

确保没有两个条目可以同时具有相同的 property 值,否则 flutter 将抛出错误,因为您将有两个相同的 ValueKeys.

我用一个数组跟踪 Entry 的实例,用一个数组跟踪相应的状态,从而解决了部分问题。

然后我可以为最后一项调用 setState(),这是我在 post.

中遇到麻烦的根源
removeEntry(_Entry entry) {
  theSetStates.removeWhere((v) => v == entry);
  theSet.removeWhere((v) => v == entry.widget);
  setState(() {});
  theSetStates.last.setState(() {});
}

如果有更简单的方法来获取 Widget 的实例列表。请告诉我。 Google 没有发现任何东西。