Flutter: Нестабильный вывод при получении массива данных в Firestore при возвращении - PullRequest
0 голосов
/ 26 октября 2019

Я получаю довольно нестабильный ответ при получении массива данных. Я показываю эти данные в списке карт. Я говорю, что не стабильный, потому что каждый раз, когда я перехожу к другой навигации в моем приложении, я возвращаюсь к той навигации, где я выводю свои данные. Сначала он показывает красный фон, а затем в течение нескольких секунд показывает данные. Кто-нибудь знает, как это исправить? Я просто новичок в флаттер / андроид. Пожалуйста помоги.

Для красного фона это показывает это на терминале и выводит данные, которые я получаю.

The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#dac03):
The getter 'documents' was called on null.
Receiver: null
Tried calling: documents

Мой код:

StreamBuilder<QuerySnapshot>(
                stream: db.collection('ACTIVITIES').snapshots(),
                builder: (context, snapshot) {
                  final issuesList = snapshot.data.documents
                      .map((doc) => doc['Issue'].map<Widget>((issue) => buildItem(issue)).toList())
                      .toList();
                  return Column(
                      children: issuesList.expand<Widget>((issue) => issue).toList()
                  );
                })

Моя структура БД:

enter image description here

Пожалуйста, помогите.

1 Ответ

1 голос
/ 26 октября 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что внутри StreamBuilder, snapshot.data есть null, а затем данные поступают. Вот почему вы видите красный экран с ошибкой, а затем он работает нормально.

Прежде всего, когда вы используете StreamBuilder, вы должны проверить, есть ли у snapshot.data что-то, а затем начать использовать данные. Вы можете использовать snapshot.hasData, например:

StreamBuilder<QuerySnapshot>(
  stream: db.collection('ACTIVITIES').snapshots(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Column(...);
    }
    return Text('Loading...');
  },
)

Теперь вы увидите 'Loading...' вместо красного экрана с ошибкой, а когда данные поступят, вы увидите данные в обычном режиме. .

Теперь, когда вы переходите на другой экран и возвращаетесь, метод build() снова срабатывает, и StreamBuilder снова получает данные из потока. Даже если Firestore кэширует данные, может потребоваться некоторое время, чтобы получить доступ, поэтому вы получите null, а затем кешированные данные поступят. Как и в первый раз, это не займет много времени, но вы, вероятно, увидите 'Loading...'.

Чтобы не показывать 'Loading...' после первого получения данных, вы можете использовать кэш памяти иустановите это initialData на StreamBuilder, например:

QuerySnapshot cache; // declare this outside build()

StreamBuilder<QuerySnapshot>(
  initialData: cache,
  stream: db.collection('ACTIVITIES').snapshots(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Column(...);
    }
    cache = snapshot.data;
    return Text('Loading...');
  },
)

С этим я думаю, что вы могли бы решить вашу проблему. Если вы хотите увидеть больше предложений, отметьте это: Как кэшировать данные Firebase во Flutter?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...