【发布时间】:2021-04-28 14:43:12
【问题描述】:
我有一个想要实施 Feed 解决方案的案例。我有一个 GraphQL 订阅,可以从数据库实时获取提要项目。我使用 Bloc/Cubit 进行简单的状态管理。
Future<void> updateFeed() async {
emit(FeedLoading());
List<Map<String, int>> _feed = [];
Snapshot snapshot = await Server.server.testSubs();
snapshot.listen((event) {});
emit(FeedUpdate(_feed));
emit(FeedLoaded());
}
这是我从提要表中获取更新列表的功能。我在提要页面上有一个动画列表,它根据小部件类型返回小部件。
Widget listWidgetType(index) {
switch (_feed[index].entries.first.key) {
case "match":
return Match(
matchId: _feed[index]["match"],
);
break;
case "transfer":
return Transfer(username: _feed[index]["transfer"]);
break;
case "news":
return News();
break;
default:
return Container(
width: 50,
height: 50,
color: Colors.yellow,
child: Text("Unknown Data"),
);
}
}
因为我需要使用这个 switch case,所以我必须有一个本地列表。所以我根据 Cubit 列表更新本地列表,然后将它们添加到这个 AnimatedList 中。
SliverAnimatedList(
key: _listKey,
itemBuilder: (context, index, animation) {
return FadeTransition(
opacity: animation.drive(Tween<double>(
begin: 0,
end: 1,
).chain(CurveTween(curve: Curves.easeInOutCirc))),
child: listWidgetType(index));
},
);
我的问题是我必须根据项目 ID 比较两个列表并查看它们是否存在。如果它们存在,我会跳过添加部分。这对于最后一项来说相当简单。但是可以说我从列表的第 10 个中删除了一个项目。我想实时动态地将其从提要中删除。所以我需要每次比较列表,根据itemCreated时间戳排序并插入到动画列表中。如果通过比较从本地列表中删除了第 10 个元素,如何从 AnimatedList 小部件中删除它。我能否以更好、更有效的方式实现这一点?
【问题讨论】:
标签: flutter listview dart flutter-test