#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() вместе для достижения этой цели, так как это вызовет проблемы с «индексами»…
Как я мог это сделать ?