В чем разница между StreamBuilder и FutureBuilder в Flutter?

«В чем разница между StreamBuilder и FutureBuilder в Flutter?» — вопрос из категории State Management, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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.