Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
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.