Чем отличаются объекты Stream и Future в контексте асинхронного программирования?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Future — это результат одной асинхронной операции: он завершится один раз и либо вернёт значение, либо ошибку. Stream — это последовательность событий во времени: он может отдавать много значений, ошибки и сигнал завершения. В Flutter Future используют для одиночных запросов, а Stream — для обновлений, событий и непрерывных данных.
Определение:
Future представляет одно значение, которое станет доступно позже. Это удобно для операций вроде загрузки данных, чтения файла или выполнения запроса к API.
Stream представляет поток событий, которые приходят последовательно. Он подходит для случаев, когда данные могут обновляться много раз: ввод пользователя, изменения в базе, WebSocket, таймеры.
Пример использования:
// Future: один запрос
Future<String> loadUserName() async {
await Future.delayed(const Duration(seconds: 1));
return 'Alex';
}
// Stream: несколько значений во времени
Stream<int> counter() async* {
for (var i = 1; i <= 3; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
loadUserName() вернёт одно значение один раз.
counter() будет выдавать значения 1, 2, 3 по мере их появления.
Пояснение кода:
Future<String>:
asyncделает функцию асинхронной.await Future.delayed(...)имитирует ожидание операции.return 'Alex'завершаетFutureединственным результатом.
Stream<int>:
async*объявляет генератор потока.yield iотправляет очередное значение в поток.- После последнего
yieldпоток завершается.
На практике Future обычно обрабатывают через await или .then(), а Stream — через listen(), StreamBuilder или await for.
Ключевые моменты:
Future= одно асинхронное значение в будущем.Stream= много значений по мере их появления.Futureзавершается один раз,Streamможет эмитить события многократно.Futureчаще используют для запросов/загрузки данных,Stream— для подписок и обновлений.- У
Streamесть события успеха, ошибки и завершения. - В Flutter для UI
Streamчасто удобно подключать черезStreamBuilder, аFuture— черезFutureBuilder.