flutter - 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 类是有状态的。
解决方案
您需要使用密钥。我建议观看此 youtube 视频以快速介绍它们,它将解决您的问题。https://www.youtube.com/watch?v=kn0EOS-ZiIc&ab_channel=GoogleDevelopers
当小部件重建时,使用键来控制框架与其他小部件匹配的小部件。默认情况下,框架会根据它们的 runtimeType 和它们出现的顺序来匹配当前和先前构建中的小部件。对于键,框架要求两个小部件具有相同的键以及相同的 runtimeType。
键在构建相同类型小部件的许多实例的小部件中最有用。例如, ShoppingList 小部件,它构建了足够的 ShoppingListItem 实例来填充其可见区域:
如果没有键,当前构建中的第一个条目将始终与前一个构建中的第一个条目同步,即使从语义上讲,列表中的第一个条目刚刚滚出屏幕并且不再在视口中可见。
通过为列表中的每个条目分配一个“语义”键,无限列表可以更有效,因为框架将条目与匹配的语义键同步,因此具有相似(或相同)的视觉外观。此外,在语义上同步条目意味着保留在有状态子窗口小部件中的状态仍然附加到相同的语义条目,而不是视口中相同数字位置的条目。
推荐阅读
- php - 如何使用 PHP 在 Wordpress 上设置全局 current_user?
- progressive-web-apps - 从页面到另一个页面的 PWA Web 蓝牙 API
- c++ - 如何访问模板类型参数包中的类型索引?
- postgresql - JOOQ 可以为 H2/Postgresql 别名 Liquibase JSONB 数据类型吗
- android - Cordova 插件 cordova-plugin-firebase-messaging 无效 ID
- objective-c - Mojave Xcode 应用程序的 AppleEvent 控制其他应用程序无法始终如一地工作 (NSAppleEventsUsageDescription)
- bash - 如何修改浮点数以显示至少 n 位
- javascript - Javascript检查对象值中是否存在数组值
- php - Laragon 管理员警告继续
- python - 基于日期时间列名称的数据框的条件平均值