Запрашиваете firestore, чтобы проверить, существует ли значение поля, и конвертируете поток в будущее? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть функция, которую я создал для запроса пожарного хранилища и проверки того, существует ли телефон в коллекции под названием «пользователи»

Я хочу получить логическое значение, если номер телефона уже не существует в поле документа. Как я могу это сделать

Future<bool> phoneRegisterCheck(phone) async{
    bool phoneAlreadyRegistered;
    print('start');
    var result = Firebase.instance.collection('users').where('phoneNo', isEqualTo: phone);
}

Я хочу дождаться, пока запрос завершится sh, а затем вернуть результат. Когда я использую метод прослушивания, это не происходит правильно, функция возвращает ноль.

Future<bool> phoneRegisterCheck(phone) async{
    bool phoneRegistered;
    print('start');
    var result = DatabaseService().userCollection.where('phoneNo', isEqualTo: phone);
    result.snapshots().listen((val){
      val.documents.isEmpty ? phoneRegistered=false:phoneRegistered=true;
    });
    return phoneRegistered;
  }

1 Ответ

2 голосов
/ 08 марта 2020

Поскольку streams асинхронны, то в вашем коде оператор возврата будет выполнен до того, как данные будут полностью получены, поэтому вы получите ноль. Вы должны использовать await for вместо listen:

Future<bool> phoneRegisterCheck(phone) async{
    bool phoneRegistered;
    print('start');
    var result = DatabaseService().userCollection.where('phoneNo', isEqualTo: phone).snapshots();
    await for(var values in result){
      values.documents.isEmpty ? phoneRegistered=false:phoneRegistered=true;
    }
    return phoneRegistered;
  }

Из документов:

Потоки можно создавать разными способами, что является топической c для другая статья, но все они могут быть использованы одинаково: асинхронный для l oop (обычно называемый только await for) повторяет события потока, как для l oop повторяет итерации.

https://dart.dev/tutorials/language/streams

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...