【问题标题】:The argument type 'BlocBuilder<dynamic, dynamic>' can't be assigned to the parameter type 'SliverChildDelegate'参数类型“BlocBuilder<dynamic, dynamic>”不能分配给参数类型“SliverChildDelegate”
【发布时间】:2021-05-25 12:28:35
【问题描述】:

我需要将数据从 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');
              },
            );
          },
        ),
      ),

【问题讨论】:

  • 好的。因此,您需要将SliverChildBuilderDelegate 传递给SliverGriddelegate 属性。现在,您希望 BlockBuilder 改为返回一个小部件。我会在下面回答这个问题。

标签: flutter bloc flutter-sliver flutter-bloc


【解决方案1】:

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

        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,
                      ),
              )
            ],
          ),
        ),

【讨论】:

  • 如果有效,对您有好处,如果无效,请使用我的第二个解决方案。它应该可以工作。
  • @PreetShah 我在 CustomScrollView 中有复杂的银器!一个 SilverAppBar、一个带有项目的 SilverList 和一个 SilverGrid 不希望为新数据列表重建所有这些复杂的小部件树!
  • 好吧,你必须做出选择。看,你的小部件依赖于块上的数据。因此,您将不得不等待数据才能构建东西。就性能而言,这是不希望的。但事实就是如此。
【解决方案2】:

试试这个:

SliverGrid(
  gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    crossAxisSpacing: 8,
    mainAxisSpacing: 8,
  ),
  delegate: SliverChildBuilderDelegate(
    (BuildContext context, int index) {
      return BlocBuilder<SubjectBloc, SubjectState>(
        builder: (context, state) {
          // Return Widgets from here.
          return Text('$index');
        },
      );
    },
  ),
),

编辑 1

或者这个:

BlocBuilder<SubjectBloc, SubjectState>(
  builder: (context, state) {
    return SliverGrid(
      // Please specify the count according to the data
      // from the BlocBuilder.
      childCount: 20,
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
        crossAxisSpacing: 8,
        mainAxisSpacing: 8,
      ),
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return Text('$index');
        },
      ),
    },
  );
),

【讨论】:

  • BlocBuilder 返回一个列表,我想以此为基础构建 SilverGrid!在您的示例中,我无法控制 SilverGrid itemCount。
  • 你能描述一下你到底需要什么吗?因为 SliverGrid 有许多不同的用途。此外,如果您已经确定了 ItemCount,那就更好了。或者,我也会给出当前答案的替代方案。也许,这会有所帮助。
猜你喜欢
  • 2021-08-29
  • 2021-10-02
  • 2021-11-06
  • 1970-01-01
  • 2021-09-15
  • 2021-10-18
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多