Как показано в моем фрагменте кода ниже, хитрость заключается в том, чтобы обернуть StreamBuilder с помощью FutureBuilder. Вам нужен FutureBuilder, если вы хотите выполнять какие-либо запросы, требующие чего-то, что займет время. В моем случае, chapter должен быть загружен, чтобы просмотр списка мог запросить его. Причина, по которой просмотр списка не обновлялся данными, заключался в том, что глава была нулевой, когда просмотр списка пытался отобразить.
Примечание: если вы запрашиваете что-то, что знаете заранее, FutureBuilder не нужен. Я проверил это для жестко закодированной главы, и она отлично работает.
return FutureBuilder(
future: _loadChapter(),
builder: (context, snapshot) {
return Scaffold(
backgroundColor: MyApp.backgroundColor,
body: StreamBuilder<QuerySnapshot>(
stream: _firestore
.collection('users')
.where("chapter", isEqualTo: chapter)
.orderBy('count', descending: true)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator());
return ListView.builder(
itemExtent: 80.0,
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_buildListItem(context, snapshot.data.documents[index]),
);
},
),
);
}
);
Вот как выглядит метод loadChapter для справки.
Future<void> _loadChapter() async {
return await _populateCurrentUser(loggedInUser);
}
_populateCurrentUser (loggedInUser) по существу находит документ, связанный с текущим вошедшим в систему пользователем, и заполняет глобальные переменные, такие как chapter .