Я хочу реализовать пустую страницу состояния в приложении Flutter, когда лента новостей пуста.
Когда в канале нет активности, я хочу показать 'нет активности«.Когда в базе данных есть данные, я хочу загрузить их из StreamBuilder
в ListView.builder
Я пытаюсь реализовать с помощью:
child: StreamBuilder(
stream: collection.snapshots(),
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();
}
Я должен вернуть что-то в операторе else, потому что иногда снимок не будетесть данные, поэтому будет выдано сообщение об ошибке, что виджет вернет значение NULL.
Но это вызывает проблемы с деревом виджетов.Потому что, если я попытаюсь использовать Navigator.push в build
Виджет позже:
Widget build(BuildContext context, DocumentSnapshot document) {
…
FlatButton(
onPressed: () async {
await function(document);
if(validated == true) {
await Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) =>
new Screen(documentInfo: documentInfo)));
}
Ошибка будет выдана:
Поиск предка деактивированного виджета небезопасен.На этом этапе состояние дерева элементов виджета больше не является стабильным.Чтобы безопасно ссылаться на предка виджета в его методе dispose (), сохраните ссылку на предка, вызвав метод attributeitFromWidgetOfExactType () в виджете didChangeDependencies ().
Есть способ избежать этого, чтобыошибка не выдана?
По какой-то причине, если я позвоню Navigator.push
до того, как дождусь function(document)
, ошибка не будет выдана.Но я не могу этого допустить, потому что он должен выполнять проверку данных в функции и только в случае успеха.
Спасибо!
ОБНОВЛЕНИЕ:
После болеетест Я думаю, что проблема является причиной StreamBuilder
.Он восстанавливает всякий раз, когда получает новое событие.Так что это вызывает проблему при вызове Navigator.push
и получении нового события, поэтому попытайтесь восстановить.
Как решить?Возможно ли остановить StreamBuilder
от перестроения потомка?