Flutter 参数类型';BlocBuilder<;动态,动态>';can';不能分配给参数类型';SliverChildDelegate';

Flutter 参数类型';BlocBuilder<;动态,动态>';can';不能分配给参数类型';SliverChildDelegate';,flutter,bloc,flutter-sliver,flutter-bloc,Flutter,Bloc,Flutter Sliver,Flutter Bloc,我需要将数据从BlocBuilder加载到SliverGrid,以显示项目网格 当我使用BlocBuilder作为SliverGrid的委托时,会出现以下错误: 无法将参数类型“BlocBuilder”分配给 参数类型“SliverChildDelegate” 我能做什么 这是我的代码示例: SliverGrid( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( cros

我需要将数据从BlocBuilder加载到SliverGrid,以显示项目网格

当我使用BlocBuilder作为SliverGrid的委托时,会出现以下错误:

无法将参数类型“BlocBuilder”分配给 参数类型“SliverChildDelegate”

我能做什么

这是我的代码示例:

      SliverGrid(
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          crossAxisSpacing: 8,
          mainAxisSpacing: 8,
        ),
        delegate: BlocBuilder<SubjectBloc, SubjectState>(
          builder: (context, state) {
            return SliverChildBuilderDelegate(
              (
                BuildContext context,
                int index,
              ) {
                return Text('$index');
              },
            );
          },
        ),
      ),
SliverGrid(
gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
横轴间距:8,
平均间距:8,
),
代表:BlocBuilder(
生成器:(上下文、状态){
回程滑动门(
(
构建上下文上下文,
整数索引,
) {
返回文本(“$index”);
},
);
},
),
),
试试这个:

SliverGrid(
gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
横轴间距:8,
平均间距:8,
),
代表:SliverChildBuilderDelegate(
(BuildContext上下文,int索引){
返回BlocBuilder(
生成器:(上下文、状态){
//从这里返回小部件。
返回文本(“$index”);
},
);
},
),
),
编辑1

或者这个:

BlocBuilder(
生成器:(上下文、状态){
回程缝栅(
//请根据数据指定计数
//来自BlocBuilder。
儿童人数:20,
gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
横轴间距:8,
平均间距:8,
),
代表:SliverChildBuilderDelegate(
(BuildContext上下文,int索引){
返回文本(“$index”);
},
),
},
);
),

我就是这样做的。如果你知道更好的解决方案,请告诉我

        SliverList(
          delegate: SliverChildListDelegate(
            [
              BlocBuilder<SampleCubit, SampleState>(
                builder: (context, state) => (state is SampleLoaded)
                    ? GridView.builder(
                        shrinkWrap: true,
                        physics: const NeverScrollableScrollPhysics(),
                        itemCount: state.userList.length,
                        gridDelegate:
                            const SliverGridDelegateWithFixedCrossAxisCount(
                          crossAxisCount: 2,
                          crossAxisSpacing: 4,
                          mainAxisSpacing: 4,
                        ),
                        itemBuilder: (BuildContext context, int index) {
                          return Text('$index');
                        },
                      )
                    : Text(
                        'str_noItemFound'.tr,
                      ),
              )
            ],
          ),
        ),
SliverList(
委托:SliverChildListDelegate(
[
BlocBuilder(
生成器:(上下文,状态)=>(状态为SampleLoaded)
?GridView.builder(
收缩膜:对,
物理学:const NeverScrollableScrollPhysics(),
itemCount:state.userList.length,
gridDelegate:
常量SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
横轴间距:4,
主轴间距:4,
),
itemBuilder:(构建上下文,int索引){
返回文本(“$index”);
},
)
:文本(
“str_noItemFound”.tr,
),
)
],
),
),

Ok。因此,您需要将
SliverChildBuilderDelegate
传递给
SliverGrid
delegate
属性。现在,您希望区块构建器返回一个小部件。我将在下面回答这个问题。BlocBuilder返回一个列表,我想在此基础上构建SilverGrid!在您的示例中,我无法控制SilverGrid itemCount。您能描述一下您到底需要什么吗?因为SliverGrid有许多不同的用途。另外,如果您已经确定了ItemCount,那么这会更好。或者,我也将给出当前答案的替代答案。也许,这会有帮助。如果它有效,对你有好处,如果没有,那么使用我的第二个解决方案。它应该能用。@PreetShah我在CustomScrollView中有复杂的银牌!一个SilverAppBar、一个包含项目的SilverList和一个SilverGrid不希望为新数据列表重建所有这些复杂的小部件树!嗯,你必须做出选择。请参见,您的小部件取决于块上的数据。因此,为了构建内容,您必须等待数据。就性能而言,这是不可取的。但事实就是这样。