Ответ
StreamBuilder и FutureBuilder — это виджеты для работы с асинхронными данными, но они предназначены для разных типов источников.
FutureBuilder используется для обработки единичного асинхронного события (Future<T>). Он строит UI один раз, когда Future завершается (успешно или с ошибкой).
FutureBuilder<String>(
future: _fetchUserProfile(), // Future, который выполнится один раз
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('Ошибка: ${snapshot.error}');
}
return Text('Данные: ${snapshot.data}');
},
)
StreamBuilder предназначен для обработки потока данных (Stream<T>), который может выдавать множество значений с течением времени. Он перестраивает UI при каждом новом событии в потоке.
StreamBuilder<int>(
stream: _messageCountController.stream, // Stream, который может эмитить много значений
builder: (context, snapshot) {
final count = snapshot.data ?? 0;
return Badge(label: Text('$count')); // Badge обновляется при каждом новом значении
},
)
Ключевое отличие: Future — это отложенное вычисление с одним результатом, а Stream — это последовательность асинхронных событий. FutureBuilder идеален для загрузки данных по API, а StreamBuilder — для обновлений в реальном времени, например, чатов или показателей с WebSocket.