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 没有发现任何东西。
我有一个 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 没有发现任何东西。