Ответ
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) |