проверьте , существует ли конкретный документ или нет, Flutter Firebase

# #firebase #flutter #google-cloud-firestore

Вопрос:

я очень новичок в flutter и firebase, и я пытался создать приложение, которое отображает сообщения обоих пользователей друг другу, если у них есть «дружба», похожая на то, что мы видим на facebook,

однако, когда я пытаюсь проверить наличие документа, используя приведенную ниже логику :

b

 ool friendship =false;
  checkConnection(String target) async{

   await FirebaseFirestore.instance.collection("users").doc(loggedUser.phoneNumber).collection("friendship").where("phoneNumber", isEqualTo: target).get().then((value) {
      if(value.docs.first.exists)
        friendship=true;
        else
        friendship=false;
    });

  }
 

а затем использовать streambuilder для отображения сообщений

 StreamBuilder(
        stream: FirebaseFirestore.instance.collection("posts").snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return snapshot.data.docs.length == 0
                ? noPosts()
                : ListView.builder(
                    itemCount: snapshot.data.docs.length,
                    itemBuilder: (context, index) {
                      DocumentSnapshot currentDoc = snapshot.data.docs[index];
                      checkConnection(currentDoc["by"]);
                         friendship?singlePostWidget(currentDoc["by"],currentDoc["context"]):SizedBox();
                    });
          } 
 

ошибка, которую я получаю, заключается в :

Е/трепетание (15767): [ошибка:флаттер/раковина/общие/раковина.в CC(242)] дротик необработанное исключение: плохое состояние: без элементов, трассировка стека: #0
список.первый (дротика:основной-патчи/growable_array.Дарт:332:5) е/трепетание (15767): #1 _CommunityState.checkConnection. (пакет:подключение/экраны/аккаунта/сообщества/сообщества.Дарт:119:21) е/трепетание (15767): #2 _RootZone.runUnary (дротика:асинхронному/зоны.Дарт:1612:54) е/трепетание (15767): #3
_FutureListener.handleValue (дротик:асинхронному/future_impl.в Dart:152:18) е/трепетание (15767): #4
будущее._propagateToListeners.handleValueCallback (дротик:асинхронному/future_impl.Дарт:704:45) е/трепетание (15767): #5
будущее._propagateToListeners (дротик:асинхронному/future_impl.Дарт:733:32) е/трепетание (15767): #6 будущее._completeWithValue (дротик:асинхронному/future_impl.Дарт:539:5) е/трепетание (15767): #7
_completeOnAsyncReturn (дротика:асинхронному-патчи/async_patch.Дарт:254:13) е/трепетание (15767): #8 запросов.вам (пакет:cloud_firestore/в src/запроса.Дарт) е/трепетание (15767): е/трепетание (15767):

Ответ №1:

Не используйте await и then вместе. Удалите ожидание из первого блока кода.

ожидание предназначено для прерывания потока процесса до тех пор, пока асинхронный метод не завершится. затем, однако, не прерывает поток процесса (это означает, что будут выполнены следующие инструкции), но позволяет запускать код после завершения асинхронного метода.