Ответ вслух Senior Управление состоянием обновлено

BLoC в большом проекте

Вопрос

Как устроен BLoC и как вы организуете его в большом приложении?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «BLoC разделяет UI и логику: виджет отправляет события, блок обрабатывает их в on<Event и выпускает новые неизменяемые состояния. Блок зависит только от репозиториев, а репозитории от источников данных: API, базы.

Что должно прозвучать в ответе

  • Событие на вход, обработчик `on<Event>`, состояние на выход через `emit`

  • Слои: UI, блок, репозиторий, источники данных; блок не знает про виджеты

  • `BlocBuilder` с `buildWhen` для UI, `BlocListener` для эффектов

  • Трансформеры событий: `droppable`, `restartable`, `sequential`, debounce для поиска

  • Тесты через `blocTest` и моки репозиториев

  • Общение блоков через репозитории или потоки, а не прямые ссылки друг на друга

Что могут спросить следом

  • Как сделать поиск с отменой предыдущего запроса?
  • Где создавать и закрывать блоки?
  • Как блок узнаёт о выходе пользователя?

Разбор

Образцовый ответ: «BLoC разделяет UI и логику: виджет отправляет события, блок обрабатывает их в on<Event> и выпускает новые неизменяемые состояния. Блок зависит только от репозиториев, а репозитории от источников данных: API, базы. В UI BlocBuilder с buildWhen перестраивает только нужное, BlocListener отвечает за навигацию и снекбары. Для поиска использую трансформер restartable с debounce: новое событие отменяет обработку старого, и не приходят устаревшие ответы. Блоки создаю через BlocProvider на том уровне дерева, где они нужны, и он же их закрывает. Блоки не держат ссылки друг на друга: если корзине нужно знать о выходе пользователя, она слушает поток из AuthRepository. Всё покрываю blocTest»

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме