← Назад к вопросам

Что такое handler?

1.0 Junior🔥 172 комментариев
#Архитектура Flutter

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Handler в Flutter и Dart: Полное руководство

Handler является фундаментальным концептом в Dart для работы с асинхронным кодом, особенно в контексте событийно-ориентированной архитектуры и многопоточности.

Что такое Handler

Определение: Handler — это функция обратного вызова, которая выполняется в ответ на определённое событие. В Dart это может быть нажатие кнопки, завершение сетевого запроса, истечение таймера или любое другое асинхронное событие.

Простой пример:

ElevatedButton(
  onPressed: () {
    print('Кнопка нажата');
  },
  child: Text('Нажми меня'),
)

Здесь onPressed — это handler, который вызывается при нажатии кнопки.

Типы Handler'ов в Flutter

1. Event Handler'ы (обработчики событий):

// Обработчик нажатия кнопки
ElevatedButton(
  onPressed: () => handleButtonPress(),
  child: Text('Нажми'),
)

// Обработчик изменения текста
TextField(
  onChanged: (text) => print('Введено: $text'),
)

// Обработчик прокрутки
ListView(
  onNotification: (notification) {
    print('Прокручено');
    return true;
  },
)

2. Callback Handler'ы (функции обратного вызова):

typedef OnComplete = void Function(String result);

class DataFetcher {
  late OnComplete onComplete;

  Future<void> fetchData() async {
    final result = await api.getData();
    onComplete(result);
  }
}

3. Lifecycle Handler'ы:

class MyWidget extends StatefulWidget {
  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() {
    // Handler инициализации
    super.initState();
    setupListeners();
  }

  @override
  void dispose() {
    // Handler очистки
    super.dispose();
    closeConnections();
  }
}

Handler'ы с Future и async/await

Future handler:

Future<String> fetchUserName() async {
  final response = await http.get(Uri.parse(url));
  return response.body;
}

// Обработка результата
fetchUserName().then((name) {
  // Handler успешного выполнения
  print('Имя: $name');
}).catchError((error) {
  // Handler ошибки
  print('Ошибка: $error');
});

Более читаемый вариант с async/await:

void loadUser() async {
  try {
    final name = await fetchUserName();
    // Handler успеха
    setState(() => _userName = name);
  } catch (error) {
    // Handler ошибки
    setState(() => _error = error.toString());
  }
}

Handler'ы со Stream'ами

Stream listener:

StreamSubscription<int> subscription = myStream.listen(
  (data) {
    // Handler получения данных
    print('Получено: $data');
  },
  onError: (error) {
    // Handler ошибки в stream
    print('Ошибка: $error');
  },
  onDone: () {
    // Handler завершения stream
    print('Stream закрыт');
  },
);

Handler'ы в State Management

BLoC паттерн:

class CounterBloc {
  final _counterController = StreamController<int>();
  Stream<int> get counterStream => _counterController.stream;

  void increment() {
    _counterController.add(_counter + 1);
  }

  void dispose() {
    _counterController.close();
  }
}

// Handler в UI
StreamBuilder<int>(
  stream: bloc.counterStream,
  builder: (context, snapshot) {
    // Handler данных из stream
    return Text('Count: ${snapshot.data}');
  },
)

Лучшие практики

1. Правильное именование:

// Хорошо
onPressed: handleButtonClick
onChanged: handleTextChange

// Плохо
onPressed: () => doStuff()
onChanged: (v) => update(v)

2. Очистка ресурсов:

StreamSubscription? _subscription;

@override
void initState() {
  super.initState();
  _subscription = stream.listen(handleData);
}

@override
void dispose() {
  _subscription?.cancel(); // Обязательная очистка!
  super.dispose();
}

3. Типизированные callback'и:

typedef ErrorHandler = void Function(String error);
typedef SuccessHandler = void Function(String result);

class DataLoader {
  void load(SuccessHandler onSuccess, ErrorHandler onError) {
    // Реализация
  }
}

Handler vs Listener

  • Handler — одноразовый обработчик события
  • Listener — постоянный наблюдатель за событиями (требует отписки)

Понимание handler'ов критично для создания отзывчивых, асинхронных приложений на Flutter.

Что такое handler? | PrepBro