У меня есть случай, когда я хочу реализовать фид-решение. У меня есть подписка на 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"),
);
}
}
Поскольку мне нужно использовать этот случай переключения, у меня должен быть локальный список. Поэтому я обновляю локальный список на основе списка 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));
},
);
Моя проблема в том, что мне нужно сравнить два списка на основе идентификатора элемента и посмотреть, существуют ли они. Если они существуют, я пропускаю добавление части. Это довольно просто для последнего пункта. Но допустим, я удалил элемент из 10-го списка. Я хочу удалить его из ленты динамически, в режиме реального времени. Поэтому мне нужно каждый раз сравнивать список, сортировать его по отметке времени itemCreated и вставлять в анимированный список. Как удалить 10-й элемент из виджета AnimatedList, если он был удален из локального списка путем сравнения. Могу ли я реализовать это лучше и эффективнее?