> Будет ли использоваться state management во Flutter и почему выбрать bloc или cubit (Flutter, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: PashaPay

Стек: Flutter, Android

> Пример ответа

Короткий ответ

Да, state management во Flutter используется практически всегда, кроме самых тривиальных виджетов. Выбор между bloc и cubit зависит от сложности бизнес-логики: cubit - для простых состояний без сложных переходов, bloc - когда нужны явные события, трансформации и строгая типизация. Для senior-уровня важно не просто назвать инструмент, а обосновать выбор архитектурно, учитывая масштаб проекта, команду и требования к тестируемости.

Подробное объяснение

Flutter - декларативный фреймворк, где UI перестраивается при изменении состояния. Без state management вы получаете либо setState в каждом виджете (что быстро становится неуправляемым), либо prop drilling, либо глобальные синглтоны с ручной подпиской. Все это ведет к сложностям с тестированием, отладкой и предсказуемостью.

Bloc и cubit - это две части одной библиотеки bloc. Cubit - упрощенная версия, где состояние меняется вызовом методов, а bloc добавляет слой событий (events), которые обрабатываются через mapEventToState или on. Разница принципиальна:

  • cubit: состояние меняется напрямую из методов, нет потока событий, меньше boilerplate, проще для простых сценариев (загрузка данных, формы, табы).
  • bloc: каждое изменение состояния инициируется событием, что дает полный контроль над последовательностью переходов, возможность использовать трансформации (debounce, throttle), а также явную трассировку всех действий.

Выбор зависит от контекста. Для небольшого приложения или отдельного экрана cubit достаточно. Для сложных фич с множеством состояний, конкурентными запросами, отменой операций - bloc предпочтительнее, так как события позволяют моделировать бизнес-процессы явно.

Также стоит учитывать альтернативы: Provider, Riverpod, GetX. Но bloc/cubit выигрывают за счет строгой архитектуры, встроенной поддержки тестирования и понятной документации. Для Android-разработчика, знакомого с MVVM и корутинами, bloc близок по духу к StateFlow + ViewModel.

На практике

На практике выбор делается на уровне архитектуры проекта. Если команда небольшая и скорость важнее формализма - cubit. Если проект крупный, с несколькими разработчиками и требованиями к аудиту действий пользователя - bloc.

Также важно не смешивать оба подхода в одном проекте без необходимости. Лучше выбрать один и придерживаться его, иначе возникает путаница. Для senior-роли ожидается, что вы сможете обосновать решение на примере конкретной фичи: например, для поиска с debounce лучше bloc, так как можно применить EventTransformer. Для простого счетчика или переключения темы - cubit.

Еще один практический момент - работа с зависимостями. Bloc требует больше кода для инжекции репозиториев и обработки ошибок, но это окупается предсказуемостью. В cubit ошибки часто обрабатываются прямо в методах, что быстрее, но менее структурировано.

Пример кода

Cubit для загрузки данных:

class DataCubit extends Cubit<DataState> {
  DataCubit(this._repository) : super(DataInitial());

  final Repository _repository;

  Future<void> load() async {
    emit(DataLoading());
    try {
      final data = await _repository.fetch();
      emit(DataLoaded(data));
    } catch (e) {
      emit(DataError(e.toString()));
    }
  }
}

Bloc с событиями для того же сценария:

sealed class DataEvent {}

class LoadData extends DataEvent {}

class DataBloc extends Bloc<DataEvent, DataState> {
  DataBloc(this._repository) : super(DataInitial()) {
    on<LoadData>(_onLoad);
  }

  final Repository _repository;

  Future<void> _onLoad(LoadData event, Emitter<DataState> emit) async {
    emit(DataLoading());
    try {
      final data = await _repository.fetch();
      emit(DataLoaded(data));
    } catch (e) {
      emit(DataError(e.toString()));
    }
  }
}

Разница видна: в bloc добавлен класс события и обработчик. Для простого вызова это избыточно, но если нужно реагировать на разные события (refresh, retry, loadMore) - bloc становится оправданным.

Как отвечать на собеседовании

Начните с того, что state management - это не обязательный атрибут, но для любого нетривиального приложения он нужен. Затем кратко опишите разницу между bloc и cubit, приведите пример из практики, где вы выбирали один из них и почему. Подчеркните, что выбор зависит от сложности состояний и требований к тестируемости. Упомяните альтернативы, но объясните, почему остановились на bloc/cubit.

Если спросят про конкретный сценарий - например, "как бы вы сделали корзину в интернет-магазине" - предложите cubit для простого добавления/удаления, но bloc, если есть промокоды, скидки и синхронизация с сервером. Покажите, что вы мыслите не шаблонно, а исходя из требований.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание принципов декларативного UI и роли state management;
  • умение сравнивать инструменты не по "модности", а по инженерным критериям;
  • способность аргументировать выбор под конкретную задачу;
  • знание внутреннего устройства bloc (events, emitters, трансформации);
  • опыт работы с тестированием (bloc_test, cubit_test).

Для senior-позиции также важно, чтобы вы могли объяснить, как ваш выбор влияет на поддерживаемость кода, скорость разработки и онбординг новых разработчиков.

Типичные ошибки

  • Ответ "всегда использую bloc, потому что это стандарт" - без обоснования.
  • Утверждение, что cubit - это "упрощенный bloc", без объяснения, когда это упрощение вредит.
  • Игнорирование альтернатив (Provider, Riverpod) - собеседование может проверить, знаете ли вы экосистему.
  • Предложение использовать bloc для всего подряд, включая тривиальные экраны - это оверхед.
  • Путаница между состоянием виджета и состоянием приложения: важно различать локальный setState и глобальный state management.
  • Отсутствие примеров из реального кода - абстрактные рассуждения без практики выглядят слабо.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью