Конструктор потоков не получает данные (Inifinite ConnectionState = ожидание) Флаттер

#flutter #dart

#трепетание #дротик

Вопрос:

У меня есть метод, который получает предметы из firestore и хранилища. Я внес некоторые изменения, чтобы иметь возможность обновлять список с помощью построителя потоков:

 class ItemLab {
  final String tipo;
  final Reference elemento;
  final String pastaVideo;
  final Map video;
  final String imageUrl;

  ItemLab({
    this.tipo,
    this.elemento,
    this.video,
    this.imageUrl,
    this.pastaVideo
  });
}

class LabController {
  final databaseReference = FirebaseFirestore.instance;
  final _storage = FirebaseStorage.instance;
  final picker = ImagePicker();
  bool hasMore = false;
Stream<List<ItemLab>> stream;
  StreamController<List<ItemLab>> _streamController;

  LabController() {
    _streamController = StreamController<List<ItemLab>>.broadcast();
    stream = _streamController.stream..toList();
  }

  void closeStream() {
    _streamController.stream.drain();
  }

  loadLab(String submenu, [int limit]) async* {
    var parts = submenu.split('/');
    var pathSlashless = parts[0].trim();
    var subPathSlashless = parts.sublist(1).join('/').trim();

    var snapshot = await _storage.ref().child("/${submenu}");
    var retorno = await snapshot.listAll();
    List<ItemLab> conteudo = [];

    if(subPathSlashless.isEmpty || subPathSlashless == null){
      retorno.prefixes.forEach((element) {
        conteudo.add(
          ItemLab(
            tipo: 'PASTA',
            elemento: element,
          ),
        );
      });
    }

    for(int i = 0; i < retorno.items.length ; i  ){
      var url = await retorno.items[i].getDownloadURL();
      conteudo.add(
        ItemLab(
          tipo: 'FILE',
          elemento: retorno.items[i],
          imageUrl: url,
        ),
      );

      if(limit != null){
        if(conteudo.length > limit){
          hasMore = true;
          yield conteudo;
        }else{
          hasMore = false;
          print("less than 9");
        }
      }
    }


      if(subPathSlashless.isNotEmpty){
        print(subPathSlashless);
        List items;
        await databaseReference
            .collection("lab_${pathSlashless}_url")
            .snapshots().forEach((element) {
              element.docs.forEach((f) {
                if(f.data()['videos'] != null){
                    items == null ? items = f.data()['videos'] :
                    items.addAll(f.data()['videos']);
                  };
                  print("ITEMS :::: >>> ${items}");
              });
        });


        for(int i = 0; i < items.length; i   ){
          //print(items[i]);
          conteudo.add(
            ItemLab(
              tipo: 'VIDEO',
              elemento: null,
              video: items[i],
            ),
          );
        }

      }else{
        await databaseReference
            .collection("lab_${pathSlashless}_url")
            .snapshots().forEach((element) {
          element.docs.forEach((f) {
            if(f.data().isNotEmpty){
              //print(f.data());
              if(f.data().keys.contains("videos")){
                conteudo.add(
                  ItemLab(
                      tipo: 'PASTA',
                      pastaVideo: findFolderName(f.reference.path)
                  ),
                );
                _streamController.add(conteudo);
              }else{
                conteudo.add(
                  ItemLab(
                    tipo: 'VIDEO',
                    elemento: null,
                    video: f.data(),
                  ),
                );
                _streamController.add(conteudo);
              }
            }
          });
        });
      }

    pathSlashless = null;
    subPathSlashless = null;

    conteudo = checkDuplicateFolder(conteudo, submenu);
    yield conteudo;
  }
 

И я хочу показать это в этом списке:

 LabController ctrlLab = LabController();

loadBasicStructure(submenu ,callback, context, scrollController, deviceSize){
return StreamBuilder(
      stream: ctrl.stream,
      builder: (ctx, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        }
 

Но при таком подходе список никогда не заполняется. Он всегда показывает CircularProgressIndicator, но не элементы.. итак, чего мне здесь не хватает?

Комментарии:

1. Мне кажется, что, возможно, ваши правила Firestore не позволяют вам получить доступ к данным. Однако, если вы поделитесь своими правилами, мы можем это исключить. Отредактируйте свой вопрос в соответствии с правилами.

2. Нет, я получаю данные прямо в conteudo.add.. Я уверен в этом

3. Да, но действительно ли поступают данные?

4. Да, я уверен в этом.добавить, что это получение данных

5. По моему мнению, если и есть проблема, то она на самом деле кроется в промежуточном коде, если, конечно, не в извлечении данных. Что вы можете сделать, так это попробовать распечатать контрольные точки. Например, после первого if в loadLab функции выведите «Контрольная точка 1», после второго выведите «Контрольная точка 2» и так далее…