В контексте, где я использую BLOC, я создал файл службы, в котором я два раза подряд запрашиваю БД (в разных папках) и обрабатываю эти данные, а затем возвращаю их в состоянии в BLO C.
Когда я отправляю RequestNewListEvent на мой BLO C, это mapEventToState вызывается:
Stream<DatosState> mapEventToState (DatosState currentState,
DatosEvent event) async* {
if (event is RequestNewListEvent) {
yield await _mapRequestNewListToState(event);
}
Future<DatosState> _mapRequestNewListToState(RequestNewListEvent event) async{
List<datoItem> returnedData= await DatosService.getDatos(event.category);
return ListItemsUpdatedState(returnedData); //I return an State to update the UI
}
структура (упрощенная) этого DatosService .getDatos (категория String) :
List dataToReturn= new List();
List dataSortedByFame= new List();
DBQueryDataInCategory().then((snapshot1){ /*filling dataSortedByFame with snapshot1*/
}).then((_){
DBQueryMoreInfoFromDataItem((snapshot2){ /*using dataOrderedByFame mixing with snapshot2 and preparing dataToReturn */
}) }).then((_)=> {return dataToReturn;});
Расширенная (но не полная) версия того же DatosService.getData (категория String) :
List<int> dataSortedByFame= new List<int>();
List<datoItem> dataToReturn= new List<datoItem>();
await db
.child('datosPorCategoria/' + category)
.once()
.then((DataSnapshot snapshot) async{
Map<dynamic, dynamic> values =
new Map<dynamic, dynamic>.from(snapshot.value);
values.sort((a, b) {
//I sort them by Fame
});
values.forEach((a) {
//i process 'a'
dataSortedByFame.add(a);
}).then((_) { //Now i'm going to query more information from another folder where is found more
//information about those Items
db
.child('/infoPorDATO')
.once()
.then((DataSnapshot snapshot) {
List<dynamic> valores = new List<dynamic>.from(snapshot.value);
dataSortedByFame.forEach((a) {
print("___DatosService101");
dataToReturn
.add(datoItem.fromJson(Map<String, dynamic>.from(valores[a])));
});
});
}).then((_){
print("___DatosService102");
return dataToReturn;
});
Проблема: глядя на консоль, я получаю возвращаемые данные (с данными, равными нулю), до завершения второго запроса (где аргумент dataToReturn получает свое значение))
консоль печатает что-то вроде
DatosService.getData has returned with data: null
___DatosService101
___DatosService102
___DatosService101
___DatosService102
___DatosService101
___DatosService102