Что такое handler в архитектуре Flutter-приложений?

«Что такое handler в архитектуре Flutter-приложений?» — вопрос из категории Архитектура, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте архитектуры Flutter-приложений (например, BLoC, Provider, Riverpod) Handler (или обработчик) — это функция или метод, который отвечает за реакцию на событие или изменение состояния. Он содержит бизнес-логику: обрабатывает пользовательский ввод, выполняет запросы к API, трансформирует данные и emits новое состояние.

Пример Handler'а в паттерне BLoC (с использованием flutter_bloc):

// Событие
class LoginButtonPressed extends AuthEvent {
  final String email;
  final String password;
  LoginButtonPressed({required this.email, required this.password});
}

// BLoC с Handler'ом (метод mapEventToState или on<Event>)
class AuthBloc extends Bloc<AuthEvent, AuthState> {
  final AuthRepository authRepo;

  AuthBloc(this.authRepo) : super(AuthInitial()) {
    // Регистрация Handler'а для события LoginButtonPressed
    on<LoginButtonPressed>(_onLoginButtonPressed);
  }

  // Сам Handler — содержит бизнес-логику
  Future<void> _onLoginButtonPressed(
    LoginButtonPressed event,
    Emitter<AuthState> emit,
  ) async {
    emit(AuthLoading()); // Новое состояние: загрузка
    try {
      final user = await authRepo.login(
        email: event.email,
        password: event.password,
      );
      emit(AuthSuccess(user)); // Новое состояние: успех
    } catch (e) {
      emit(AuthFailure(e.toString())); // Новое состояние: ошибка
    }
  }
}

Роль и характеристики Handler'а:

  • Изоляция логики: Handler инкапсулирует реакцию на конкретное событие, делая код предсказуемым и тестируемым.
  • Асинхронность: Часто выполняет асинхронные операции (сетевые запросы, чтение БД).
  • Чистая функция (в идеале): Для данного события и текущего состояния должен возвращать детерминированное новое состояние. Побочные эффекты (навигация, показ диалогов) обычно выносятся в отдельный слой (например, BlocListener).

Где ещё встречаются Handler'ы:

  • В Riverpod — это методы внутри StateNotifier или логика внутри ref.read/ref.watch в провайдерах.
  • В GetX — это методы внутри GetxController.
  • В обработчиках жестов (GestureDetector.onTap) или жизненного цикла (WidgetsBindingObserver).