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).