Как выполнить async в InitState в Flutter?

Да, в методе initState
можно загружать асинхронные данные, но поскольку сам initState
не может быть помечен как async
, нужно обрабатывать асинхронный код немного иначе. Вот распространённый подход:
Использование отдельной асинхронной функции
Ты можешь вызвать асинхронную функцию из initState
, которая будет обрабатывать асинхронные операции:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
String _data = "Загрузка...";
@override
void initState() {
super.initState();
_loadData(); // Вызов асинхронной функции
}
Future<void> _loadData() async {
// Симуляция сетевого запроса или другой асинхронной задачи
await Future.delayed(Duration(seconds: 2));
final fetchedData = "Данные загружены!";
// Обновляем состояние после загрузки данных
setState(() {
_data = fetchedData;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text(_data), // Отображение загруженных данных
),
);
}
}
Основные моменты:
initState()
сам по себе не является асинхронным, поэтому нельзя использоватьawait
напрямую внутри него.- Асинхронная функция (в данном случае
_loadData
) вызывается внутриinitState
, чтобы обработать асинхронную задачу. setState()
вызывается после завершения загрузки данных, чтобы обновить UI.
Этот паттерн позволяет загружать данные асинхронно при инициализации виджета.