StreamBuilder не обновляет элементы, когда я получаю больше

У меня есть список со всеми элементами из этой папки, и я получаю данные с 10 элементами за раз (сначала загружаю 10, когда пользователь достигает конца списка, загружает еще 10). Проблема в том, что когда список нужно обновлять, это не так. Он не добавляет новые элементы в список.

Это метод, которым я получаю данные из firebase:

Future<void> loadnovo(
      {String submenu,
        int limit = 10,
        bool cls = false,
        bool initialLoad = false,
        int lastIndex}) async {
    if (cls) {
      conteudo.clear();
      hasMore = true;
    }
    if (_isLoading || !hasMore) {
      return Future.value();
    }
    _isLoading = true;

    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();

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

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

      _streamController.add(conteudo);

    }

    hasMore = true;
  }

Это мой экран с построителем потока, gridView (который показывает элементы) и scrollListener:

LabController ctrlLab;
  final lab = LabMdScreen();
 inal scrollController = ScrollController();
  int lastIndex = 0;

  scrollListener() async {
    if (scrollController.position.maxScrollExtent == scrollController.offset) {
      lastIndex += 10;
      ctrlLab.loadList(submenu: "ph/Res", lastIndex: lastIndex);
    }
  }

  @override
  void initState() {
    ctrlLab = LabController();
    ctrlLab.loadList(submenu: "ph/Res", lastIndex: lastIndex,cls: true, initialLoad: true);

    scrollController.addListener(scrollListener);
    super.initState();
  }

  @override
  void dispose() {
    scrollController.removeListener(scrollListener);
    super.dispose();
  }


  loadBasicStructureDetail(submenu ,callback, context, deviceSize){
    return StreamBuilder(
      stream: ctrlLab.stream,
      builder: (ctx, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        } else if (snapshot.error != null) {
          print(snapshot.error);
          return Center(child: Text('Ocorreu um erro!'));
        }else {
          return GridView.builder(
            padding: EdgeInsets.all(10.0),
            controller: scrollController,
            itemCount: snapshot.data.length +1,
            itemBuilder: (ctx, i) {

              path = callback;
              if (i < snapshot.data.length) {
                ItemLab item = snapshot.data[i];
                >>>> here my code to format the tiles...

Что мне здесь не хватает


person armstrong    schedule 20.02.2021    source источник


Ответы (1)


Попробуйте удалить

if (_isLoading || !hasMore) {
      return Future.value();
    }
person Ada Lovelassy    schedule 20.02.2021