Flutter StreamBuilder возвращает ноль из Firestore - PullRequest
1 голос
/ 14 мая 2019

Идея состоит в том, чтобы отобразить строку из случайного документа в коллекции в Firebase.Простая функция getRandom() извлекает общее количество документов и генерирует случайное целое число r, которое подается в экземпляр Firebase.

Выходные данные в приложении всегда null.

* 1007.*
Stream<Words> getWords() async* {
  int r = await getRandom();

  print("RANDOM NO: " + "$r");

  Firestore.instance.document("vocabs/foods/words/$r")
      .get()
      .then((snapshot){
    try {
      return Words().english;

    } catch(e){
      print("ERROR");
      return null;
    }
  });
}

class Words{

  Words(): super();

  String english;

  Words.fromSnapshot(DocumentSnapshot snapshot)
  : english = snapshot.data["english"];
}

Firestore DB part 1

Firestore DB part 2

1 Ответ

1 голос
/ 14 мая 2019

Я создал этот фрагмент кода для вас, чтобы дать вам несколько вариантов для достижения того, что вы хотели бы сделать:

import 'dart:async';

class Word {    
  final String english;
  const Word(this.english);
}

Future<Iterable<Word>> get firebaseSnapshot async => [ Word('aWord'), Word('bWord'), Word('cWord') ];

Stream<String> getEnglishWords() async* {
  yield* await firebaseSnapshot.then((words) => Stream.fromIterable(words.map((w) => w.english)));
}

Stream<String> getEnglishWords2() async* {    
  final words = await firebaseSnapshot.then((words) => words.map((w) => w.english));
  yield* Stream.fromIterable(words);
}

Stream<String> getEnglishWords3() async* {    
  final snapshot = await firebaseSnapshot;
  for(final word in snapshot) {
    yield word.english;
  }  
}

main() async {
  await for(final englishWord in getEnglishWords()) {
    print(englishWord);
  }

  await for(final englishWord in getEnglishWords2()) {
    print(englishWord);
  }

  await for(final englishWord in getEnglishWords3()) {
    print(englishWord);
  }
}

Я бы использовал вариант № 2. Есть некоторые существенные соображения производительности вокруг этого. Я копаюсь в затылке для лекции вокруг этого ... Нет, не могу вспомнить ... Если я найду это, я обновлю тебя.

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