Я пытаюсь сначала получить значение из документа в 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 мне действительно странна.