Проблема, с которой вы сталкиваетесь, заключается в том, что внутри 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?