Какие возможности есть у bloc из коробки во Flutter
Что проверяют
Знаете ли вы актуальный API bloc и flutter_bloc, а не пример из старой статьи. Следом обычно спрашивают, чем Cubit отличается от Bloc и как в BLoC гасить повторные нажатия.
Как отвечать
Разделите, что даёт ядро bloc, а что пакет flutter_bloc. Ядро:
BlocиCubit:Cubitменяет состояние методами черезemit,Blocпринимает события и обрабатывает их вon<Event>((event, emit) async {...}).Blocвидит полный переход, событие вместе со старым и новым состоянием;- отсев повторов: состояние, равное текущему по
==, не публикуется, поэтому состояния делают неизменяемыми и сравнивают черезEquatableилиfreezed; - хуки:
onChange,onTransition(только уBloc),onError, а глобальноBlocObserverдля логов и аналитики; - конкурентность событий: по умолчанию обработчики работают параллельно, пакет
bloc_concurrencyдаёт трансформерыsequential,droppable,restartable; - стримы:
emit.forEachиemit.onEachподписываются на поток и сами отписываются при закрытии.
Пакет flutter_bloc:
BlocProvider,MultiBlocProvider,RepositoryProvider: внедрение через дерево виджетов и автоматическийclose();BlocBuilderсbuildWhen,BlocListenerсlistenWhenдля навигации и снекбаров,BlocConsumerиBlocSelector;- расширения контекста:
context.read,context.watch,context.select.
Для Android-разработчика удобна параллель: Cubit близок к ViewModel со StateFlow, а BlocListener к обработке одноразовых событий. Тесты пишут через отдельный пакет bloc_test, это уже не «из коробки».
Где спотыкаются
Показывают mapEventToState и yield. Этот API удалён в bloc 8, и такой код не собирается.
Мутируют список в старом состоянии и отдают тот же объект. Состояние равно текущему, emit его отбрасывает, и экран не обновляется.
Путают BlocProvider(create: ...) и BlocProvider.value. Существующий блок, переданный через create, закроется вместе с виджетом, а новый, созданный в .value, не закроется никогда.