Listview 为什么;initState();每次在0索引处插入新项时触发的所有列表项的方法?
我想将新的小部件(StatefulWidget)添加到列表顶部的ListViewListview 为什么;initState();每次在0索引处插入新项时触发的所有列表项的方法?,listview,dart,flutter,Listview,Dart,Flutter,我想将新的小部件(StatefulWidget)添加到列表顶部的ListView项。插入(0,listItem),但执行此操作时,列表的所有元素都将再次初始化(initState()hook每次都在调用) 如果我要将项目添加到列表的底部items.add(listItem)-一切都按预期工作(initState()仅在新添加的元素上调用。) 用于演示目的的代码 ListItem小部件代码 结果 调用addItem()函数3次时的控制台输出(仅举个例子): 当新项目追加到列表底部时,预期输出(it
项。插入(0,listItem)
,但执行此操作时,列表的所有元素都将再次初始化(initState()
hook每次都在调用)
如果我要将项目添加到列表的底部items.add(listItem)
-一切都按预期工作(initState()
仅在新添加的元素上调用。)
用于演示目的的代码
ListItem小部件代码
结果
调用addItem()
函数3次时的控制台输出(仅举个例子):
当新项目追加到列表底部时,预期输出(items.add(listItem)
而不是items.insert(0,listItem)
)
这种情况有什么解决办法吗?我想列出以前添加的保留旧状态的项
我试图将列表视口的轴方向更改为
up
(将ListView
的reverse
属性更改为true
),但得到了相同的结果。这是因为您正在更改项目的顺序键
ListView(
children: items,
reverse: true,
)
及
应该有用
class ItemsList extends StatefulWidget {
State<StatefulWidget> createState() => ItemsListState();
}
class ItemsListState extends State<ItemsList> {
var items = List<ListItem>();
@override
Widget build(BuildContext context) {
return GestureDetector(
child: ListView(children: items),
onTap: addItem);
}
void addItem() {
final label = items.length.toString();
print('Add $label');
final listItem = ListItem(key: ValueKey(label), label: label);
items.insert(0, listItem);
this.setState(() {
items = []..addAll(items);
});
}
}
Add 0
initState() 0
Add 1
initState() 1
initState() 0
Add 2
initState() 2
initState() 1
initState() 0
Add 0
initState() 0
Add 1
initState() 1
Add 2
initState() 2
ListView(
children: items,
reverse: true,
)
final listItem = ListItem(key: ValueKey(label), label: label);
items.add(listItem);
this.setState(() {
items = List.from(items);
});