Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Listview 为什么;initState();每次在0索引处插入新项时触发的所有列表项的方法?_Listview_Dart_Flutter - Fatal编程技术网

Listview 为什么;initState();每次在0索引处插入新项时触发的所有列表项的方法?

Listview 为什么;initState();每次在0索引处插入新项时触发的所有列表项的方法?,listview,dart,flutter,Listview,Dart,Flutter,我想将新的小部件(StatefulWidget)添加到列表顶部的ListView项。插入(0,listItem),但执行此操作时,列表的所有元素都将再次初始化(initState()hook每次都在调用) 如果我要将项目添加到列表的底部items.add(listItem)-一切都按预期工作(initState()仅在新添加的元素上调用。) 用于演示目的的代码 ListItem小部件代码 结果 调用addItem()函数3次时的控制台输出(仅举个例子): 当新项目追加到列表底部时,预期输出(it

我想将新的小部件(StatefulWidget)添加到列表顶部的ListView
项。插入(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);
        });