#flutter #firebase-realtime-database
# #flutter #firebase-база данных в реальном времени
Вопрос:
У меня есть список IDs ( Future<List<String>> _listaIdEmpresasF
), и я хотел бы запросить данные на основе каждого идентификатора в списке. Я использую два FutureBuilders: первый для получения списка идентификаторов, а второй для отображения данных, связанных с каждым идентификатором.
Мой код выглядит следующим образом…
@override
void initState() {
super.initState();
_listaIdEmpresasF = _usuarioBloc.cargarEmpresasDeUsuario(_prefs.idUsuario);
}
Widget _crearListado(BuildContext context) {
return FutureBuilder(
future: _listaIdEmpresasF,
builder: (BuildContext context, AsyncSnapshot snapshot) {
print(snapshot.connectionState);
if (snapshot.connectionState == ConnectionState.done amp;amp; snapshot.hasData != null){
final List<String> _listaIdEmpresas = snapshot.data;
return FutureBuilder(
future: _empresaDatosBloc.cargarEmpresaDatosListado(_listaIdEmpresas),
builder: (BuildContext context, AsyncSnapshot snapshot2) {
print(snapshot2.connectionState);
if (snapshot2.connectionState == ConnectionState.done amp;amp; snapshot2.hasdata) {
final List<EmpresaDatosModel> _listaEmpresas = snapshot2.data;
return Stack(
children: <Widget>[
ListView.builder(
itemCount: _listaEmpresas.length,
itemBuilder: (context, i) {
return _crearItem(context, _listaEmpresas[i], i);
},
padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 0.0, bottom: 20.0),
),
],
);
} else return Align(
alignment: Alignment.center,
child: Center (child: Image(image: AssetImage('Preloader.gif'), height: 500.0,)),
);
},
);
}
else return Align(
alignment: Alignment.center,
child: Center (child: Image(image: AssetImage('Preloader.gif'), height: 500.0,)),
);
},
);
}
Чтобы получить данные из каждого идентификатора, я использую цикл следующим образом:
Future<List<EmpresaDatosModel>> cargarEmpresaDatosListado(List<String> listaIdEmpresas) async {
final List<EmpresaDatosModel> listaEmpresas = new List();
listaIdEmpresas.forEach((id) async {
Query resp = db.child('empresas/$id/datos');
final snapshot = await resp.once();
if (snapshot.value == null) return [];
final temp = EmpresaDatosModel.fromJson(Map<String,dynamic>.from(snapshot.value));
temp.idEmpresa = id;
listaEmpresas.add(temp);
print('${temp.nombre} subida');
await resp.once().then((snapshot) {
print("Los Datos de una Empresa se cargaron totalmente - ${temp.nombre}");
});
});
listaEmpresas.forEach((element) {print('Emp ${element.nombre}');});
return listaEmpresas;
}
Проблема: я не могу получить полные данные. Например, если у меня есть три идентификатора в _listaIdEmpresas, иногда приложение отображает список одной компании (связанной с первым идентификатором), иногда двух компаний (first и secod ID), а иногда и трех компаний. Я предположил, что это связано с тем, что состояние подключения второго моментального снимка выполняется перед чтением всех трех циклов..
Я попытался добавить условие, но оно не сработало…
if (snapshot2.connectionState == ConnectionState.done amp;amp; snapshot2.data.length == _listaIdEmpresas.length)
Я не могу запросить все компании и отфильтровать их как список компаний из-за настроенных правил безопасности запросов.
Я хотел бы включить конкретный список идентификаторов в параметры запроса, но я не знаю, возможно ли это.
Как правильно считывать данные из списка идентификаторов?
Ответ №1:
снимок.ключ выдаст вам идентификатор элемента
Комментарии:
1. Вы предлагаете запрос orderbykey? Как выполнить запрос в определенном списке идентификаторов в качестве параметра?