Тип аргумента 'BlocBuilder ‹динамический, динамический›' нельзя присвоить типу параметра 'SliverChildDelegate'.

Мне нужно загрузить данные из 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');
              },
            );
          },
        ),
      ),

person Hossein Yousefpour    schedule 23.02.2021    source источник
comment
Ok. Итак, вам нужно передать SliverChildBuilderDelegate свойству delegate SliverGrid. Теперь вы хотите, чтобы BlockBuilder вместо этого возвращал виджет. Я отвечу на это ниже.   -  person Preet Shah    schedule 23.02.2021


Ответы (2)


Вот как я это сделал. Если вы знаете лучшее решение, дайте мне знать.

        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,
                      ),
              )
            ],
          ),
        ),
person Hossein Yousefpour    schedule 23.02.2021
comment
Если это сработает, хорошо для вас, если нет, тогда используйте мое второе решение. Он должен работать. - person Preet Shah; 23.02.2021
comment
@PreetShah У меня есть сложные серебряные украшения внутри CustomScrollView! SilverAppBar, SilverList с элементами и SilverGrid. Не рекомендуется перестраивать все это сложное дерево виджетов для списка новых данных! - person Hossein Yousefpour; 24.02.2021
comment
Что ж, тебе предстоит сделать выбор. Видите ли, ваш виджет зависит от данных в блоке. Итак, вам придется подождать данных, чтобы собрать материал. Что касается производительности, то это нежелательно. Но что есть, то есть. - person Preet Shah; 24.02.2021

Попробуй это:

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');
        },
      ),
    },
  );
),
person Preet Shah    schedule 23.02.2021
comment
BlocBuilder возвращает список, на основе которого я хочу построить SilverGrid! В вашем примере у меня нет контроля над элементом SilverGrid itemCount. - person Hossein Yousefpour; 23.02.2021
comment
Вы можете описать, что именно вам нужно? Потому что у SliverGrid много разных целей. Кроме того, если у вас уже есть значение ItemCount, это будет лучше. Или я также дам альтернативу текущему ответу. Может быть, это поможет. - person Preet Shah; 23.02.2021