рендеринг сетки с помощью блока во флаттере

Вот случай:- у меня есть блок с именем XYZBloc, который загружает данные из сети. мне нужно отобразить эти списки в sloverGrid. тот же список хорошо сочетается с sloverList.

Store.dart

@override
Widget build(BuildContext context) {
return BlocProvider(
  create: (context) => _xyzBloc,
  child: AnnotatedRegion<SystemUiOverlayStyle>(
    value: SystemUiOverlayStyle.light,
    child: Container(
      width: MediaQuery.of(context).copyWith().size.width,
      height: MediaQuery.of(context).copyWith().size.height,
      child: BlocBuilder<XyzBloc, XyzState>(
          bloc: _xyzBloc,
          builder: (context, state) {
            if (state is XYZLoadingState) {
              return buildLoading();
            } else if (state is XYZErrorState) {
              return buildErrorUi(state.message);
            } else if (state is XYZLoadedState) {
              return _buildPageView(state.lists, context);
            } else {
              return Container();
            }
          }),
    ),
  ),
);
}

_buildPageView(List<XYZModel> lists, BuildContext context) {
return SliverGrid(
  gridDelegate:
      SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
  delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
    return Container(
      padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Container(
              color: Colors.grey, height: 130.0, width: double.infinity),
          Text(lists[index].name)
        ],
      ),
    );
  }, childCount: lists.length),
);
}

код для загрузки данных sloverGrid:-

Home.dart

@override
Widget build(BuildContext context) {
double cardWidth = MediaQuery.of(context).size.width / 3.3;
double cardHeight = MediaQuery.of(context).size.height / 3.6;
return Container(
  color: AppTheme.nearlyWhite,
  child: Scaffold(
    backgroundColor: Colors.transparent,
    body: Column(
      children: <Widget>[
        SizedBox(
          height: MediaQuery.of(context).padding.top,
        ),
        getAppBarUI(),
        Expanded(
            child: CustomScrollView(
          slivers: <Widget>[
            SliverList(
                delegate: SliverChildListDelegate([
              Padding(
                padding: EdgeInsets.all(15),
                child: Container(
                  width: MediaQuery.of(context).size.width,
                  height: 150,
                  child: BannerItems(),
                ),
              ),
            ])),
            SliverList(
              delegate: SliverChildListDelegate(
                [
                  Padding(
                    padding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
                    child: Container(
                      decoration: BoxDecoration(color: Colors.transparent),
                      height: 100,
                      child: Category(),
                    ),
                  ),
                ],
              ),
            ),
            Stores(),
          ],
        )),
      ],
    ),
  ),
);
}

Я пробовал все возможные способы отладки, но мое чутье новичка не могло помочь мне понять, как эта SlyverGrid работает с сетевыми данными. любое предложение, ссылка будет высоко оценена.

1 ответ

Вот мой фрагмент кода, в котором я использовал SliverGrid со сборщиками блоков.

      Widget build(BuildContext context) {
    
    return BlocProvider(
      create: (context) => BlogViewBloc()..add(const FetchBlog(blogType: BlogType.upcoming)),
      child: Scaffold(
        backgroundColor: kAppBackground,
        appBar: PreferredSize(
          preferredSize: Size(width , 120),
          child: const CustomAppBar(),
        ),
        body: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 40),
          child: CustomScrollView(
            physics: const BouncingScrollPhysics(),
            slivers: [
              SliverList(
                delegate: SliverChildListDelegate(
                  [
                    Row(
                      children: [
                        const Spacer(),
                        _counter('Total Views',
                            'assets/images/totalViews.svg', 0, 999),
                        const Spacer(),
                        _counter(
                            'Total Blogs',
                            'assets/images/totalBlogs.svg', 0, 50),
                        const Spacer(),
                        _counter('Total Followers',
                            'assets/images/totalFollowers.svg', 0, 40),
                        const Spacer(),
                      ],
                    ),
                    Padding(
                      padding: const EdgeInsets.only(bottom: 40),
                      child: Text('Featured Blogs',
                          style: style40PrimaryDark, textAlign: TextAlign.justify),
                    ),
                  ],
                ),
              ),
              BlocBuilder<BlogViewBloc, BlogViewState>(
                builder: (context, state) {
                  if (state.blogs?.isNotEmpty ?? false) {
                    return SliverGrid(
                      gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
                        maxCrossAxisExtent: 800.0,
                        mainAxisSpacing: 60.0,
                        crossAxisSpacing: 100.0,
                      ),
                      delegate: SliverChildBuilderDelegate(
                            (BuildContext context, int index) {
                          return BlogGridView(blogModel: state.blogs![index]);
                        },
                        childCount: state.blogs?.length ?? 0,
                      ),
                    );
                  } else {
                    return const SliverToBoxAdapter(
                      child: SizedBox(
                        height: 0,
                      ),
                    );
                  }
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
Другие вопросы по тегам