Назад к вопросам
Junior
140
questionbank

Что такое FutureBuilder в Flutter?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Виджет для построения интерфейса на основе асинхронных данных, полученных из Future.

Основные параметры:

  • future: Экземпляр Future, за которым следует наблюдать.
  • initialData: Данные, которые отображаются до завершения future.
  • builder: Функция (AsyncWidgetBuilder), которая вызывается при каждом изменении состояния future и получает BuildContext и AsyncSnapshot.

Состояния AsyncSnapshot:

  • ConnectionState.none: Future еще не начал выполняться.
  • ConnectionState.waiting: Future выполняется.
  • ConnectionState.active: (Редко для Future) Future вернул промежуточные данные.
  • ConnectionState.done: Future завершен (успешно или с ошибкой).

Пример использования:

// Предположим, у нас есть функция, которая возвращает Future<String>
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2)); // Имитация сетевого запроса
  return "Данные загружены!";
}

// ... в build методе виджета:
@override
Widget build(BuildContext context) {
  return FutureBuilder<String>(
    future: fetchData(), // Наш Future
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        // Отображаем индикатор загрузки, пока Future выполняется
        return CircularProgressIndicator();
      } else if (snapshot.hasError) {
        // Отображаем сообщение об ошибке, если Future завершился с ошибкой
        return Text('Ошибка: ${snapshot.error}');
      } else {
        // Отображаем данные, если Future успешно завершен
        return Text('Результат: ${snapshot.data}');
      }
    },
  );
}

Преимущества:

  • Упрощает работу с асинхронными операциями в UI.
  • Автоматически перестраивает UI при изменении состояния Future.
  • Четко разделяет логику загрузки данных и логику построения UI.

Недостатки:

  • Может приводить к излишним перерисовкам, если Future создается внутри метода build. Рекомендуется создавать Future один раз (например, в initState).