Класс FutureBuilder прослушивает Future, а затем передает его значения своим дочерним и потомкам. Во Flutter класс FutureBuilder — это мощный инструмент для обработки асинхронных операций и обновления пользовательского интерфейса после завершения операции.
Итак, как же работает класс FutureBuilder? Что ж, для этого нужны два важных аргумента: будущее и строитель. Аргумент Future представляет асинхронную операцию, которую мы хотим прослушивать, а аргумент builder — это функция обратного вызова, которая принимает BuildContext и AsyncSnapshot в качестве параметров и возвращает виджет.
Давайте рассмотрим несколько примеров кода, чтобы проиллюстрировать, как использовать класс FutureBuilder в различных сценариях:
-
Базовое использование:
Future<int> fetchData() async { // Simulating an asynchronous operation await Future.delayed(Duration(seconds: 2)); return 42; } FutureBuilder<int>( future: fetchData(), builder: (BuildContext context, AsyncSnapshot<int> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return CircularProgressIndicator(); } else if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } else { return Text('Data: ${snapshot.data}'); } }, );В этом примере у нас есть функция fetchData, которая возвращает будущее, которое преобразуется в целочисленное значение. FutureBuilder прислушивается к этому будущему и соответствующим образом обновляет пользовательский интерфейс. Пока будущее находится в состоянии ConnectionState.waiting, отображается индикатор CircularProgressIndicator. В случае возникновения ошибки отображается сообщение об ошибке. Наконец, когда будущее завершается успешно, данные отображаются.
-
Пользовательская загрузка и состояния ошибок:
Future<String> fetchData() async { await Future.delayed(Duration(seconds: 2)); throw Exception('Failed to fetch data'); } FutureBuilder<String>( future: fetchData(), builder: (BuildContext context, AsyncSnapshot<String> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Text('Custom loading state...'); } else if (snapshot.hasError) { return Text('Custom error state: ${snapshot.error}'); } else { return Text('Data: ${snapshot.data}'); } }, );В этом примере функция fetchData генерирует исключение для имитации неудачной операции. Мы можем настроить состояния загрузки и ошибки, возвращая различные виджеты на основе свойств ConnectionState и hasError AsyncSnapshot.
-
Обработка нескольких будущих состояний:
enum DataState { loading, success, error } Future<DataState> fetchData() async { await Future.delayed(Duration(seconds: 2)); // Simulating different states final random = Random().nextInt(3); if (random == 0) { return DataState.loading; } else if (random == 1) { return DataState.success; } else { throw Exception('Failed to fetch data'); } } FutureBuilder<DataState>( future: fetchData(), builder: (BuildContext context, AsyncSnapshot<DataState> snapshot) { switch (snapshot.data) { case DataState.loading: return CircularProgressIndicator(); case DataState.success: return Text('Data loaded successfully'); case DataState.error: return Text('Failed to fetch data'); default: return Text('Something went wrong'); } }, );В этом примере мы определяем перечисление DataState, которое представляет различные состояния будущего. Функция fetchData случайным образом возвращает одно из этих состояний. Обратный вызов компоновщика использует оператор переключения для обработки каждого состояния и соответствующего отображения различных компонентов пользовательского интерфейса.
Используя класс FutureBuilder, вы можете легко обрабатывать асинхронные операции и обновлять свой пользовательский интерфейс в зависимости от будущего. Это мощный инструмент, упрощающий работу с асинхронным кодом во Flutter.
В заключение, класс FutureBuilder во Flutter прослушивает Future и эффективно передает его значения своим дочерним и потомкам. Это универсальный класс, который помогает вам управлять асинхронными операциями и поддерживать отзывчивость пользовательского интерфейса. Благодаря способности обрабатывать различные состояния и настраиваемым компонентам пользовательского интерфейса FutureBuilder является удобным инструментом в вашем наборе инструментов Flutter.