Ответ
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, без вариантов. Главное — не путай их, а то получится манда с ушами.