Как выполнить 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.

Этот паттерн позволяет загружать данные асинхронно при инициализации виджета.