В чем разница между `Future` и `Stream` в Dart?

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

Ответ

Future и Stream — это основные абстракции Dart для работы с асинхронными операциями, но они решают разные задачи.

Future

Представляет единственное значение (или ошибку), которое будет доступно в будущем. Это операция "запустил и забыл", которая завершается один раз.

Future<String> fetchUserData() async {
  await Future.delayed(Duration(seconds: 2)); // Имитация сетевого запроса
  return 'Данные пользователя';
}

void main() async {
  print('Запрос начат...');
  String data = await fetchUserData(); // Ожидаем ОДНО значение
  print('Получено: $data');
}

Используйте Future для: HTTP-запросов, чтения файлов, любых разовых асинхронных задач.

Stream

Представляет последовательность асинхронных событий (данных или ошибок), которые поступают с течением времени. Поток можно слушать многократно.

Stream<int> countdown(int from) async* {
  for (int i = from; i > 0; i--) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Генератор отправляет значение в поток
  }
}

void main() {
  final stream = countdown(5);
  stream.listen((value) {
    print('Осталось: $value сек.'); // Слушаем МНОГО значений
  });
}

Используйте Stream для: обновлений UI (например, из StreamController), чтения данных в реальном времени (чаты, сокеты), обработки пользовательских событий (нажатия кнопок в Flutter).

Сводка: Аспект Future Stream
Количество значений Одно Много (0, 1 или более)
Метод получения await listen, await for
Аналог Promise (JavaScript) Observable (Rx)