Ответ
В контексте архитектуры 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).