Пустая страница состояния и проблемы с навигатором? - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу реализовать пустую страницу состояния в приложении 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 от перестроения потомка?

1 Ответ

0 голосов
/ 27 февраля 2019

Это происходит потому, что вы пытаетесь перейти куда-то еще, пока ваше дерево виджетов все еще строится.

Вы должны переместить Navigation.push в потоковый прослушиватель, например, в ваш initState.

void initState() {
super.initState();
collection.snapshots.listen((data){

if(validated == true) {
   await Navigator.push(context, new MaterialPageRoute(
      builder: (BuildContext context) =>
      new Screen(documentInfo: documentInfo)));
  }
});

}
...