Снимок FutureBuilder всегда либо равен нулю, либо не содержит данных

#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 in async ?

3. Это каким-то образом сработало! Как я уже сказал, я очень новичок в Flutter, и я думал, что await и then были эквивалентными операторами. Большое вам спасибо

4. конечно, ваше приветствие