Flutter StreamBuilder vs FutureBuilder

 В Flutter как StreamBuilder, так и FutureBuilder используются для построения части пользовательского интерфейса на основе асинхронных данных. Однако они служат разным целям, в зависимости от типа асинхронного источника данных: Stream для StreamBuilder и Future для FutureBuilder. Вот подробное сравнение:

1. FutureBuilder

  • Назначение: FutureBuilder используется для одноразовых асинхронных операций, которые возвращают результат в будущем. Он следит за Future и обновляет пользовательский интерфейс, когда Future завершается.

  • Использование: Обычно используется, когда вы ожидаете результат только один раз. Например, получение данных из API или загрузка данных из базы данных.

  • Как это работает:

    • Принимает Future в качестве аргумента и строит пользовательский интерфейс на основе состояния Future (ожидание, завершено или ошибка).
    • Future выполняется один раз, и FutureBuilder реагирует на его завершение.
  • Пример:

    FutureBuilder(
      future: someAsyncFunction(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text("Ошибка: ${snapshot.error}");
        } else {
          return Text("Данные: ${snapshot.data}");
        }
      },
    );
    

2. StreamBuilder

  • Назначение: StreamBuilder используется для прослушивания непрерывного потока данных и реакции на каждое изменение в потоке. Он больше подходит для данных в реальном времени или для повторяющихся обновлений данных.

  • Использование: Обычно используется в сценариях, где данные изменяются со временем, например, обмен сообщениями в реальном времени, живые данные из WebSocket или обновления из потока Firebase Firestore.

  • Как это работает:

    • Принимает Stream в качестве аргумента и перестраивает пользовательский интерфейс всякий раз, когда поток отправляет новое событие с данными.
    • Постоянно слушает обновления от потока, который может передавать несколько значений со временем.
  • Пример:

    StreamBuilder(
      stream: someStream,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text("Ошибка: ${snapshot.error}");
        } else if (snapshot.hasData) {
          return Text("Данные: ${snapshot.data}");
        } else {
          return Text("Данные недоступны");
        }
      },
    );
    

     

 

Ключевые различия:

Особенность FutureBuilder StreamBuilder
Тип данных Работает с одиночным Future. Работает с непрерывным Stream.
Количество обновлений Однократный результат, без постоянных обновлений. Несколько обновлений по мере поступления данных.
Сценарий использования Лучший вариант для одноразовых асинхронных вызовов. Лучший вариант для данных в реальном времени или постоянных обновлений.
Состояние Обрабатывает состояния Future, такие как ожидание и завершение. Обрабатывает состояния потока, такие как текущие данные, ошибка или отсутствие данных.
Частота перестроений Перестраивается, когда Future завершён. Перестраивается всякий раз, когда поток отправляет новые данные.

Когда использовать:

  • Используйте FutureBuilder, если вы получаете данные один раз и не ожидаете, что они изменятся (например, одноразовый вызов API).
  • Используйте StreamBuilder, если вам нужно следить за данными, которые изменяются со временем (например, обновления в реальном времени, соединения через сокеты или потоки Firebase Firestore).