> Какие возможности есть у bloc из коробки во Flutter (Flutter, Android)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: PashaPay
Стек: Flutter, Android
> Пример ответа
Короткий ответ
Bloc из коробки даёт: разделение UI и бизнес-логики через BlocProvider, BlocBuilder, BlocListener, BlocConsumer; управление состоянием через Stream/Sink; обработку ошибок через onError; трансформации событий через EventTransformer (debounce, throttle); автоматическую отмену подписок через close(). Плюс - BlocObserver для глобального логирования, Equatable для сравнения состояний, и HydratedBloc для персистентности. Всё это - без сторонних пакетов, только flutter_bloc и bloc.
Подробное объяснение
Bloc - это реализация паттерна Business Logic Component поверх Streams. Из коробки доступны:
- Базовые виджеты:
BlocProvider(инъекция),BlocBuilder(перестройка UI),BlocListener(side-effects),BlocConsumer(комбинация builder + listener),MultiBlocProviderиMultiBlocListenerдля композиции. - Жизненный цикл:
close()для освобождения ресурсов, автоматическая отмена подписок при dispose. - Обработка ошибок: переопределение
onErrorвBloc- ловит все исключения изmapEventToState/onEventиemit. - Трансформации событий:
EventTransformer- встроенныеdebounceTime,throttleTime,restartable,droppableчерезStreamTransformer. - Глобальный наблюдатель:
BlocObserver-onChange,onTransition,onErrorдля логирования, аналитики, отладки. - Сравнение состояний:
Equatable(из пакетаequatable) - позволяет избежать лишних rebuild, если состояние не изменилось. - Персистентность:
HydratedBloc- автоматическое сохранение состояния в хранилище (например,SharedPreferences) и восстановление при старте. - Асинхронность:
emitс поддержкойasync*иyield, а такжеemitв новых версиях (без генераторов). - Тестирование:
bloc_test- встроенный пакет для unit-тестов сblocTest.
На практике
Для senior-позиции важно не просто перечислить, а показать понимание trade-off. Например:
BlocBuilderсbuildWhen- для точечной перестройки. Без этого - лишние rebuild.BlocListener- для навигации, snackbar, показа диалогов. Не использовать вbuilder.EventTransformer- критичен для поиска (debounce) или кнопок (throttle).HydratedBloc- удобен, но требует аккуратности с версионированием состояния (миграции).BlocObserver- обязателен в продакшене для логирования ошибок, но не для чувствительных данных.- На практике часто комбинируют с
freezedдля иммутабельных состояний иget_itдля DI, но это уже не из коробки.
Пример кода
class AuthBloc extends Bloc<AuthEvent, AuthState> { AuthBloc() : super(AuthInitial()) { on<LoginRequested>(_onLogin, transformer: debounce(const Duration(milliseconds: 300))); } @override void onError(Object error, StackTrace stackTrace) { // логирование в Crashlytics super.onError(error, stackTrace); } Future<void> _onLogin(LoginRequested event, Emitter<AuthState> emit) async { emit(AuthLoading()); try { final user = await api.login(event.email, event.password); emit(AuthSuccess(user)); } catch (e) { emit(AuthFailure(e.toString())); } } } // Использование BlocProvider( create: (_) => AuthBloc(), child: BlocConsumer<AuthBloc, AuthState>( listenWhen: (prev, curr) => curr is AuthFailure, listener: (context, state) => showSnackBar(context, state.message), buildWhen: (prev, curr) => curr is! AuthFailure, builder: (context, state) { if (state is AuthLoading) return CircularProgressIndicator(); return LoginForm(); }, ), )
Как отвечать на собеседовании
- Начни с краткого перечисления, затем углубляйся в детали по мере вопросов.
- Подчеркни, что
bloc- это не просто state management, а архитектурный паттерн с чёткими правилами. - Приведи пример из реального проекта: как использовал
EventTransformerдля поиска,BlocObserverдля аналитики. - Упомяни ограничения: много boilerplate, сложность для простых экранов, необходимость продумывать иерархию
BlocProvider. - Покажи понимание альтернатив:
Provider,Riverpod,GetX- и объясни, когда bloc избыточен.
Что проверяет интервьюер
- Глубину понимания реактивного программирования (Streams, backpressure).
- Умение проектировать иерархию блоков и их взаимодействие.
- Знание lifecycle и утечек памяти (когда вызывать
close). - Практический опыт: как дебажить состояния, как тестировать блоки.
- Способность объяснить trade-off между
BlocBuilderиBlocListener.
Типичные ошибки
- Путают
BlocBuilderиBlocListener- используют listener для rebuild. - Забывают про
buildWhen/listenWhen- отсюда лишние rebuild. - Не переопределяют
onError- ошибки молча проглатываются. - Используют
Equatableнеправильно: не переопределяютpropsили включают изменяемые поля. - Создают
BlocProviderвнутриbuild- теряют состояние при rebuild. - Не закрывают блоки вручную, если используют не
BlocProvider(например, вinitState). - Слишком много блоков на один экран - усложняют поддержку.
> Похожие задачи по mobile
Какие методы жизненного цикла приложения во Flutter используются для отслеживания сворачивания и разворачивания
Какие пакеты для локального хранения данных во Flutter использовать
Какие пакеты для проверки состояния сети во Flutter используются
Как работает таймер в iOS и с чем связана его работа
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью