Как читать из списка идентификаторов в Firebase?

#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? Как выполнить запрос в определенном списке идентификаторов в качестве параметра?