Флаттер: Как ожидать значение из документа в Firestore и отсортировать коллекцию с помощью BLo C? - PullRequest
0 голосов
/ 13 апреля 2020

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

Вот мой код:

Actuality_blo c:


  final _repository = Repository();
  final _parasha = BehaviorSubject<String>();
  final _parashiot = BehaviorSubject<QuerySnapshot>();

  Stream<String> get parasha => _parasha.stream;

  getParashaOfWeek() async {
    String para = await _repository.parasha();
    return _parasha.sink.add(para);
  }

  getParashiot(){
    return _repository.parashiotOfWeek('');
  }

  dispose() async {
    await _parasha.drain();
    _parasha.close();
    await _parashiot.drain();
    _parashiot.close();
  }
}

FirestoreProvider:


  Firestore _firestore = Firestore.instance;

  Stream<QuerySnapshot> getAllCourses(){
    return _firestore.collection('cours').orderBy('createdate').snapshots();
  }

  Stream<QuerySnapshot> getAllAudios(){
    return _firestore.collection('audios').orderBy('createdate').snapshots();
  }

  Future<String> getParashaOfWeek() async{
    var docs = await _firestore.collection('actualite').getDocuments();
    String parasha = await docs.documents[0].data['parasha'];
    return parasha;
  }

  Stream<QuerySnapshot> getParashiotOfWeek({@required String parasha}){
    return _firestore.collection('cours').where('name'.toLowerCase(), isEqualTo: parasha.toLowerCase()).snapshots();
  }

}

Репозиторий:

  final _firestoreProvider = FirestoreProvider();

  Stream<QuerySnapshot> courses() => _firestoreProvider.getAllCourses();
  Stream<QuerySnapshot> audios() => _firestoreProvider.getAllAudios();
  Future<String> parasha() => _firestoreProvider.getParashaOfWeek();
  Stream <QuerySnapshot> parashiotOfWeek(String parasha) => _firestoreProvider.getParashiotOfWeek(parasha: parasha);

}

ActualityBlocProvider:


  final bloc = ActualityBloc();

  ActualityBlocProvider({Key key, Widget child}) : super(key: key, child: child);

  bool updateShouldNotify(_) => true;

  static ActualityBloc of(BuildContext context){
    return (context.dependOnInheritedWidgetOfExactType<ActualityBlocProvider>()).bloc;
  }

}

Пожалуйста, помогите, концепция blo c мне действительно странна.

...