StreamBuilder doesn't updating items when I get more

Viewed 120

I have a list with all the items from that folder, and I'm retrieving the data with 10 items per time (first load 10, when user reach the list finish, it loads more 10). The problem Is, when list have to be updated, it is not. It doesn't add the new items in the list.

This is the method I get data from 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;
  }

This is my Screen with the Stream builder, a gridView (which show the items) and the 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...

What I'm missing here

1 Answers

Try removing

if (_isLoading || !hasMore) {
      return Future.value();
    }
Related