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

Ответ

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)

Ответ 18+ 🔞

Бля, ну слушай, смотри, тут всё проще пареной репы, если честно. Есть две штуки — Future и Stream. Они оба про асинхронность, но задачи у них, ёпта, как небо и земля.

Future (Будущее, одноразовка)

Это как пообещать тебе пиццу. Ты звонишь, заказываешь, ждёшь. Курьер приезжает один раз и отдаёт тебе одну коробку. Всё. На этом история заканчивается. Либо пицца, либо он уехал в лес и тебе пришла ошибка.

Future<String> fetchUserData() async {
  await Future.delayed(Duration(seconds: 2)); // Симулируем, что интернет у нас как в 2002-м году
  return 'Данные пользователя';
}

void main() async {
  print('Запрос начат...');
  String data = await fetchUserData(); // ТУПО ЖДЁМ, пока эта хуйня выполнится
  print('Получено: $data'); // И всё, приехали
}

Где это юзать? Да везде, где одно действие — один результат. Запрос на сервер, сохранение файла, любая операция "сделал — получил — пошёл дальше". Future — это твой базовый инструмент, доверия ебать ноль, но работает.

Stream (Поток, многоразовка)

А вот это уже ёперный театр. Представь, что ты подключился к стриму какого-нибудь чувака, который играет в Dota. События идут одно за другим: убил, умер, нахуевертил, опять умер. Это поток данных, который может литься бесконечно.

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 сек.'); // И мы слушаем этот поток, как радио
  });
}

Где это юзать? Всё, что связано с постоянными обновлениями. Чат в реальном времени, показания с датчиков (типа GPS), все эти модные штуки в Flutter вроде StreamBuilder, куда льются события от нажатий кнопок. Stream — это когда данных овердохуища и они приходят, когда хотят.

Коротко, чтобы не ебать мозг

Что сравниваем Future Stream
Сколько значений? Одно, и точка. Много. Может быть ноль, одно или бесконечность.
Как получать? Просто await и жди. Подписывайся через listen или гоняй в цикле await for.
На что похоже? Обещание (Promise) в JavaScript. Наблюдаемая хуйня (Observable) из всяких Rx-библиотек.

Вывод: Если тебе нужно просто получить что-то один раз — бери Future, не мудри. Если тебе нужно слушать и реагировать на поток событий — тогда уже Stream, без вариантов. Главное — не путай их, а то получится манда с ушами.