StreamBuilder
перестраивается при получении нового события.Это вызывает проблемы, например, с навигацией (Navigator.push
), потому что, если новое событие получено во время навигации, этот триггер перестраивается.Поскольку попытаться перемещаться, пока дерево виджетов все еще строится, это выдаст error .
невозможно предотвратить перестроение , чтобы избежать этой проблемы по мере необходимости.
Предлагаемый обходной путь - это, как правило, получение потока из кэша .Также: здесь и здесь
Но это значение не может иметь список сборки StreamBuilder, который постоянно обновляется, если также требуется обеспечить навигацию по картам в списке.Например, в карточке onPressed()
. См. Здесь .
Итак, чтобы обновить данные, необходимо использовать pull для обновления ...
У кого-нибудь есть лучшее решение?Или команда Flutter работает над устранением этого ограничения, например, разрешением запретить восстановление, если карта была нажата пользователем?
ОБНОВЛЕНИЕ:
TL; DR - обновление только для обновления данных с момента потокав StreamBuilder должен быть кэширован, чтобы предотвратить его перестройку при каждом получении нового события?
ОБНОВЛЕНИЕ 2:
Я пытался реализовать данные кэша, но мой код не работает:
Stream<QuerySnapshot> infoSnapshot;
fetchSnapshot() {
Stream<QuerySnapshot> infoSnapshot = Firestore.instance.collection(‘info’).where(‘available’, isEqualTo: true).snapshots();
return infoSnapshot;
}
@override
void initState() {
super.initState();
fetchSnapshot();
}
...
child: StreamBuilder(
stream: infoSnapshot,
builder: (context, snapshot) {
if(snapshot.hasData) {
return ListView.builder(
itemBuilder: (context, index) =>
build(context, snapshot.data.documents[index]),
itemCount: snapshot.data.documents.length,
);
} else {
return _emptyStateWidget();
}
ОБНОВЛЕНИЕ 3:
Я пытаюсь использовать StreamController
, но не могу правильно выполнить:
Stream<QuerySnapshot> infoStream;
StreamController<QuerySnapshot> infoStreamController = StreamController<QuerySnapshot>();
@override
void initState() {
super.initState();
infoStream = Firestore.instance.collection(‘info’).where(‘available’, isEqualTo: true).snapshots();
infoStreamController.addStream(infoStream);
}
…
child: StreamBuilder(
stream: infoStreamController.stream,
builder: (context, snapshot) {
ОБНОВЛЕНИЕ 4:
Предложение использовать _localStreamController
выдавать ошибку:
StreamController<QuerySnapshot> _localStreamController = StreamController<QuerySnapshot>();
@override
void initState() {
super.initState();
Firestore.instance.collection(‘info’).snapshots().listen((QuerySnapshot querySnapshot) {
// if(userAdded == null) {
_localStreamController.add(querySnapshot);
// }
});
...
child: StreamBuilder(
stream: _localStreamController.stream,
builder: (context, snapshot) {
Получатель 'stream' был вызван для нуля.
Метод 'add' был вызван для нуля.