Что такое Future в Dart?

«Что такое Future в Dart?» — вопрос из категории Асинхронность, который задают на 52% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Future<T> — это объект, представляющий результат потенциально асинхронной операции, которая завершится либо успешным значением типа T, либо ошибкой. Это основа работы с асинхронным кодом в Dart (сетевыми запросами, чтением файлов, таймерами).

Состояния Future:

  1. Незавершенный (Uncompleted): Операция еще выполняется.
  2. Завершенный с значением (Completed with a value): Операция успешно завершилась.
  3. Завершенный с ошибкой (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 завершится.