-1

我在 SliverGrid 下面有以下内容,它是从 API 填充的。在进行 API 调用之前,我不知道项目的数量。当我滚动过去的项目时,下面的当前实现会呈现文本“No More”,因为我没有设置 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
));

}

4

2 回答 2

1

如果这是一个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; });
                      }
...
于 2019-08-26T04:36:20.700 回答
0

最后我通过将 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,
             )
      )
      );
  }
于 2019-08-28T01:36:31.333 回答