#firebase #flutter #dart #google-cloud-firestore
#firebase #флаттер #dart #google-облако-firestore
Вопрос:
Я довольно новичок в flutter и надеюсь, что эту проблему можно легко решить, но до сих пор я понятия не имею, что происходит не так.
У меня есть приложение, в котором я хотел бы вернуть список пользователей после нажатия кнопки поиска. Я думаю, что FutureBuilder с ListView.builder является правильным выбором для этого, но почему-то я не могу отобразить свои данные в FutureBuilder, хотя моя функция async определенно находит результаты. Мое будущее:
Future<List<Map<dynamic, dynamic>>> results;
кнопка:
onPressed: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
setState(() {
results = null;
searched = true;
});
results = getGuestData(widget.place['placeName'], query);
}
},
Функция асинхронности:
Future<List<Map>> getGuestData(String placeName, Map query) async {
List<Map> result = [];
CollectionReference guestsRef = Firestore.instance
.collection(XXX)
.document(XXX)
.collection(XXX);
if (query['date'] == null) {
guestsRef
.where('lastName', isEqualTo: query['lastName'])
.where('firstName', isEqualTo: query['firstName'])
.getDocuments()
.then((doc) {
if (doc != null) {
result = doc.documents.map((x) => x.data).toList(); \debugger shows this is working
}
}).catchError((e) => print("error fetching data: $e"));
}
return resu<
и, наконец, проблема:
FutureBuilder<List<Map>>(
future: results,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
List guests = snapshot.data;
return ListView.builder(
shrinkWrap: true,
itemCount: guests.length,
itemBuilder: (context, index) {
return ListTile(
... //do stuff here
);
},
);
} else {
return CircularProgressIndicator();
}
},
)
снимок.данные действительно окажутся списком, но размер всегда равен 0, несмотря на то, что запрос getGuestData находит пользователей.
Комментарии:
1. ошибка моментального снимка всегда была нулевой, насколько я видел в отладчике
2. хорошо, почему вы используете метод
Future.then
, а неawait
inasync
?3. Это каким-то образом сработало! Как я уже сказал, я очень новичок в Flutter, и я думал, что await и then были эквивалентными операторами. Большое вам спасибо
4. конечно, ваше приветствие