动态地将项目添加到 SliverList 的顶部 - 上一个项目的状态被错误地保留
Dynamically adding items to top of SliverList - state of previous item is incorrectly kept
我有一个项目列表 recentlyScanned
,我正在 SliverList 中绘制,如下所示:
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTileItemProduct2(data: model.recentlyScanned[index]);
},
childCount: model.recentlyScanned.length,
),
)
每个项目都有颜色编码来表示其在列表时应用的状态。我使用 list.add(item)
成功地将一个项目动态添加到列表底部 - 一切看起来都很棒。我现在面临的问题是我希望 newly/dynamically 添加的项目出现在列表的顶部。我试过几种方法:
recentlyScanned.reverse.toList()
- 更改要以相反顺序发送的源
recentlyScanned.insert(0, item)
- 将一个项目添加到列表的索引 0,将所有内容向下推
- 添加项目时,使用
recentlyScanned.sort((a,b) => a.compareTo(b));
对列表进行排序
虽然这些功能中的每一个在技术上都有效(它们将列表排序为正确的“反向”顺序),但 previous 项目的状态保留在 SliverList 中。这意味着现在位于列表顶部的新项目的状态颜色继承了它替换的项目的颜色,之前位于顶部的项目现在继承了第二个项目的状态,等等。添加到底部时不会发生这种情况列表。
有什么想法可以 a) 在添加项目时重建整个 SliverList 或 b) 让 Sliver 列表像通常在将项目添加到数组底部时那样工作,但相反?
您需要将唯一键传递给 ListTile - 这会强制 flutter 刷新列表而不是通常的(激进且快速)缓存
ListTile(
key: Key('UniqueString'),
...
我有一个项目列表 recentlyScanned
,我正在 SliverList 中绘制,如下所示:
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTileItemProduct2(data: model.recentlyScanned[index]);
},
childCount: model.recentlyScanned.length,
),
)
每个项目都有颜色编码来表示其在列表时应用的状态。我使用 list.add(item)
成功地将一个项目动态添加到列表底部 - 一切看起来都很棒。我现在面临的问题是我希望 newly/dynamically 添加的项目出现在列表的顶部。我试过几种方法:
recentlyScanned.reverse.toList()
- 更改要以相反顺序发送的源recentlyScanned.insert(0, item)
- 将一个项目添加到列表的索引 0,将所有内容向下推- 添加项目时,使用
recentlyScanned.sort((a,b) => a.compareTo(b));
对列表进行排序
虽然这些功能中的每一个在技术上都有效(它们将列表排序为正确的“反向”顺序),但 previous 项目的状态保留在 SliverList 中。这意味着现在位于列表顶部的新项目的状态颜色继承了它替换的项目的颜色,之前位于顶部的项目现在继承了第二个项目的状态,等等。添加到底部时不会发生这种情况列表。
有什么想法可以 a) 在添加项目时重建整个 SliverList 或 b) 让 Sliver 列表像通常在将项目添加到数组底部时那样工作,但相反?
您需要将唯一键传递给 ListTile - 这会强制 flutter 刷新列表而不是通常的(激进且快速)缓存
ListTile(
key: Key('UniqueString'),
...