Ответ
Future<T> — это объект, представляющий результат потенциально асинхронной операции, которая завершится либо успешным значением типа T, либо ошибкой. Это основа работы с асинхронным кодом в Dart (сетевыми запросами, чтением файлов, таймерами).
Состояния Future:
- Незавершенный (Uncompleted): Операция еще выполняется.
- Завершенный с значением (Completed with a value): Операция успешно завершилась.
- Завершенный с ошибкой (Completed with an error): Операция завершилась неудачно.
Основные способы работы с Future:
- Использование
async/await(рекомендуется для линейного кода):
Future<String> fetchUserData() async {
// Имитация сетевого запроса
await Future.delayed(Duration(seconds: 1));
// В реальности здесь будет, например, http.get()
return '{"name": "John"}';
}
void main() async {
try {
print('Загрузка...');
String jsonData = await fetchUserData(); // Код "ждет" завершения Future
print('Данные получены: $jsonData');
} catch (error) {
print('Ошибка загрузки: $error');
}
}
- Использование цепочек
then/catchError/whenComplete:
void main() {
fetchUserData()
.then((data) {
print('Данные получены: $data');
return data.length; // Можно преобразовать результат
})
.then((length) => print('Длина данных: $length'))
.catchError((error) => print('Ошибка: $error'))
.whenComplete(() => print('Операция завершена (успех или ошибка).'));
}
Ключевой момент: Future не блокирует основной поток выполнения. Код после вызова асинхронной функции продолжает выполняться сразу, а результат обрабатывается, когда Future завершится.