Анимированный список в StreamBuilder (и виджет удаляется сам по себе)

#flutter #flutter-streambuilder #flutter-animatedlist

#трепетать #флаттер-потокостроитель #флаттер-анимированный список

Вопрос:

Я пытаюсь создать страницу Избранного, которая принимает список отмеченных избранных как ListTile() и позволяет пользователю отключить избранное. Я использую потоковый контроллер для управления списком избранного, поскольку он используется во всем приложении.

Итак, моя любимая страница выглядит так :

 class FavoritesListPageBody extends StatelessWidget {  FavoritesListPageBody({Key? key}) : super(key: key);  final _animatedListKey = new GlobalKeylt;AnimatedListStategt;();   @override  Widget build(BuildContext context)  {  final ScoresBloc bloc = BlocProvider.oflt;ScoresBlocgt;(context);    return StreamBuilderlt;Listlt;Scoregt;gt;(  stream: bloc.favorites,  initialData: bloc.favoritesManager.favorites,  builder: (BuildContext context, AsyncSnapshotlt;Listlt;Scoregt;gt; snapshot)  {   if(bloc.favoritesManager.favorites.isEmpty)  {  return Container(  constraints: const BoxConstraints.expand(),  color: Theme.of(context).colorScheme.favListEmptyBackground,  child: Column(  mainAxisAlignment: MainAxisAlignment.center,  children: [  Icon(Icons.search_rounded, size: 120, color: Theme.of(context).colorScheme.noFavoriteFound),  const SizedBox(height: 50,),  Text("Aucun favori", style: TextStyle(color: Theme.of(context).colorScheme.noFavoriteFound)),  ],  )  );  }     for(Score fav in bloc.favoritesManager.favorites)  {  this._animatedListKey.currentState?.insertItem(bloc.favoritesManager.favorites.indexOf(fav));  }     return AnimatedList(  key: this._animatedListKey,  initialItemCount: bloc.favoritesManager.favorites.length,  itemBuilder: (BuildContext context, int index, Animationlt;doublegt; animation)  {  var curved = new CurvedAnimation(parent: animation, curve: const Interval(.5, 1));    Score score = bloc.favoritesManager.favorites[index];   return SizeTransition(  sizeFactor: CurvedAnimation(parent: animation, curve: const Interval(0, .5)),  child: SlideTransition(  position: Tween(  begin: const Offset(1, 0),  end: const Offset(0, 0)  ).animate(curved),  child: Column(  children: [  ScoreTile(  score: score,  onPressed: ()  {  bloc.toggleFavorite(score);  _animatedListKey.currentState!.removeItem(  index,  (context, animation) =gt; Column(children: [  ScoreTile(score: score),  Divider(height: 1, color: Theme.of(context).colorScheme.separator)  ]),  duration: const Duration(seconds: 1)  );  },  ),  Divider(height: 1, color: Theme.of(context).colorScheme.separator)  ]  )  )  );  },  );  }  );  } }  

Добавление избранного хорошо работает везде, где я это делаю. Удаление favs отлично работает, если я делаю это на всех страницах, кроме этой. Приведенный выше код работает, но не анимация, так как я раньше не использовал «insertItem»… Для этого «статично», как базовый вид списка.

Когда я использую insertItem() при создании AnimatedList, а затем пытаюсь удалить избранное с этой страницы, я получаю эту ошибку : RangeError (RangeError (index): Invalid value: Not in inclusive range 0..2: 3)

Я думаю, что я не могу использовать StreamBuilder() и insertItem()/removeItem() вместе для достижения этой цели, так как это вызовет проблемы с «индексами»…

Как я мог это сделать ?