В Dart / Flutter, как я могу узнать, нет ли Коллекции в базе данных Firestore? - PullRequest
0 голосов
/ 05 января 2019

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

- Есть ли способ найти коллекцию, не получив ее снимки?
- Почему break; или yield* Stream.empty() зависает поток, как бесконечный поток!

Stream<userInfo> getCurrentUserInfos() async* {
  final String usersCollectionPath = "users";
  Stream<QuerySnapshot> snapshots = Firestore.instance.collection(usersCollectionPath).snapshots();
  snapshots.isEmpty.then((hasNoUserCollection) {
    // Although I don't have 'users' collection
    // in my database but I never reach this point!
    // i.e. hasNoUserCollection is always FALSE! 
    if(hasNoUserCollection) {
      print("users collection doesn't exist, create it!");
      // next line (i.e. `break;`) hangs the tool!
      // And sometimes hangs the VSCode's IDE as well, if I have a breakpoint on it!!!
      break;
      // I tried yielding an empty stream instead of break, again another hang!
      // yield* Stream<userInfo>.empty();
    } else {
      // previous stream is dead, so create it again!
      snapshots = Firestore.instance.collection(usersCollectionPath ).snapshots();
      await for (QuerySnapshot snap in snapshots) {
      for (DocumentSnapshot userDoc in snap.documents) {
        yield (new userInfo.fromQuerySnapshot(userDoc));
      }
    }
  });
}

Теперь даже блок try-catch не может отследить, что пошло не так, когда поток пуст!

try{
  getCurrentUserInfos().last.then((userInfolastOne) {
    print("last one: $lastOne.name");
  });

 // the following line (i.e. await ...) at least doesn't hang and
 // `catch` block is able to catch the error `Bad state: No element`,
 // when the stream is empty
 //
 // userInfo lastOne = await stream.last;
} catch (ex) {
  print ("ex: $ex");
}

1 Ответ

0 голосов
/ 06 января 2019

Нет API для определения наличия коллекции. Фактически: коллекция в Firestore существует, только если в ней есть документы.

Самая дешевая проверка, о которой я могу подумать, - это выполнить запрос для одного документа, а затем проверка этого запроса даст какие-либо результаты.

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