Есть ли способ установить childCount на слигрид, заполняемый из API?

У меня есть ниже SliverGrid, который заполняется из API. Я не знаю количество элементов, пока не сделаю вызов API. Текущая реализация, представленная ниже, отображает текст "Больше", когда я прокручиваю последние элементы, потому что я не установил childCount. Есть ли способ для меня, чтобы установить childCount. Я бы хотел, чтобы он прекратил прокручивать и рендерить что-нибудь.

Я попытался создать переменную для хранения переменной childCount и переустановить ее в блоке snapshot.hasData, однако новое значение, похоже, игнорируется.

return SliverGrid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
  delegate: SliverChildBuilderDelegate(
        (BuildContext context,int index)
        {
          return StreamBuilder(
            stream: bloc.attributesStream ,
            builder: (context, snapshot)
            {                        
                  if(snapshot.hasData)
                  {
                      return HomeIconCell(snapshot.data[index]);
                      //want to set childCount to snapshot.data.length

                  }
                  return Text("No more");

            },
            );               
        },
        childCount: gridChildCount
));

}

2 ответа

Если это StatefulWidget вы можете использовать setState обновить счетчик сетки.

...
                builder: (context, snapshot)
                {                        
                      if(snapshot.hasData)
                      {
                          return HomeIconCell(snapshot.data[index]);
                          //want to set childCount to snapshot.data.length
                          setState((){ gridChildCount = snapshot.data.length; });
                      }
...

Я решил проблему, обернув SliverGrid внутри StreamBuilder.

Widget build(BuildContext context) 
  {   
    final bloc = AttributesProvider.of(context);
    bloc.getAttributeList();
   // APIServiceProvider  api = APIServiceProvider();
    //Future<List<AttributeModel>> attributesListFuture = api.getAttributes();

    return StreamBuilder(
      stream: bloc.attributesStream,
      builder: (context, AsyncSnapshot<List<AttributeModel>>snapshot) =>SliverGrid(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
                delegate: SliverChildBuilderDelegate(
                (context, index) => HomeIconCell(snapshot.data[index]),
                childCount: snapshot.hasData ? snapshot.data.length : 0,
             )
      )
      );
  }
Другие вопросы по тегам