首页 > 解决方案 > Flutter从ListView.builder中删除项目不起作用

问题描述

我有一个小部件列表,我想删除最后一项,但是当我执行下面的 5 行时,没有任何反应。

if (mounted) {
  setState(() {
    verlustContentList.removeLast();
  });
}

这就是我生成列表的方式:

  generateList() async {

   return verlustContentList = List.generate(
     15,
     (index) => VerlustContent(
       key: Key(
         index.toString(),
       ),
       
     ),
   );
 }

这就是我显示列表的方式:

StreamBuilder(
                  stream: generateList().asStream(),
                  builder: (BuildContext context, AsyncSnapshot snapshot) {
                    return ListView.builder(
                      itemCount: verlustContentList.length,
                      itemBuilder: (context, index) {
                        
                          return verlustContentList[index];
                        
                      },
                    );
                  },
                );

带有设计的 VerlustContent 类是有状态的。

标签: flutterlistviewstream-builder

解决方案


您需要使用密钥。我建议观看此 youtube 视频以快速介绍它们,它将解决您的问题。https://www.youtube.com/watch?v=kn0EOS-ZiIc&ab_channel=GoogleDevelopers

当小部件重建时,使用键来控制框架与其他小部件匹配的小部件。默认情况下,框架会根据它们的 runtimeType 和它们出现的顺序来匹配当前和先前构建中的小部件。对于键,框架要求两个小部件具有相同的键以及相同的 runtimeType。

键在构建相同类型小部件的许多实例的小部件中最有用。例如, ShoppingList 小部件,它构建了足够的 ShoppingListItem 实例来填充其可见区域:

如果没有键,当前构建中的第一个条目将始终与前一个构建中的第一个条目同步,即使从语义上讲,列表中的第一个条目刚刚滚出屏幕并且不再在视口中可见。

通过为列表中的每个条目分配一个“语义”键,无限列表可以更有效,因为框架将条目与匹配的语义键同步,因此具有相似(或相同)的视觉外观。此外,在语义上同步条目意味着保留在有状态子窗口小部件中的状态仍然附加到相同的语义条目,而不是视口中相同数字位置的条目。


推荐阅读