flutter - 如何在GridView中每6个不同的项目渲染一个图像?

标签 flutter dart flutter-layout

屏幕图像

api回应

{
                "id": 16,
                "name": "Nomlanga Stout",
                "description": "Voluptas Nostrum Exercitation N",
                "advertiser": "لا يوجد",
                "image": "http://alaa.rmal.sa/goblin/public/admin/assets/images/placeholder.jpg",
                "images": [
                    "http://alaa.rmal.sa/goblin/public/admin/assets/images/placeholder.jpg"
                ],
                "price": "740",
                "is_banner": false,
                "location": "Sequi Facilis Accusantium Volup",
                "since": "منذ ساعة 22",
                "is_fav": false
            },

            {
                "id": 3,
                "image": "http://alaa.rmal.sa/goblin/public/uploaded/banners/banner_qzNwwPnx1Vkw_2019-09-11.jpg",
                "name": "لا يوجد",
                "description": "لا يوجد",
                "advertiser": "لا يوجد",
                "images": [],
                "price": "لا يوجد",
                "location": "لا يوجد",
                "since": "لا يوجد",
                "is_banner": true,
                "is_fav": false
            }

我想创建一个产品的gridview,每行有2个项目,每6个产品我要添加一个采用屏幕宽度的图像。

我试图通过创建一个返回2行的列表 View 来自定义它
如果 *“is_banner”为假,则为图像,如果 “is_banner”为真,则为图片*
但这不起作用
ListView.builder(
                          primary: false,
                          shrinkWrap: true,
                          itemCount: _ads.length,
                          itemBuilder: (BuildContext context, int index) {
                            if (indexAd < _ads.length) {
                              print("Indexxxx" + indexAd.toString());
                              return _ads[indexAd].isBanner
                                  ? Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: Container(
                                        width:
                                            MediaQuery.of(context).size.width,
                                        height: 100,
                                        decoration: BoxDecoration(
                                          borderRadius:
                                              BorderRadius.circular(8),
                                          image: DecorationImage(
                                            fit: BoxFit.cover,
                                            image: NetworkImage(
                                                _ads[indexAd++].image),
                                          ),
                                        ),
                                      ),
                                    )
                                  : Row(
                                      children: <Widget>[
                                        InkWell(
                                          onTap: () {
                                             print("--***********************---> ${indexDetail++}");
                                            // Navigator.of(context).push(
                                            //     PageRouteBuilder(
                                            //         pageBuilder: (_, __, ___) {

                                            //   return AdDetailPage(
                                            //     model: widget.model,
                                            //     adId: _ads[indexDetail].id,
                                            //   );
                                            // }));
                                          },
                                          child: ProductCard(
                                            name: _ads[indexAd].name,
                                            image: _ads[indexAd].image,
                                            address: _ads[indexAd].location,
                                            isFav: _ads[indexAd].isFav,
                                            date: _ads[indexAd].since,
                                            price: _ads[indexAd++].price,
                                          ),
                                        ),
                                        InkWell(
                                          onTap: () {
                                            print("--+++++++++++++++++++++++---> ${indexDetail++}");
                                            // Navigator.of(context).push(
                                            //     PageRouteBuilder(
                                            //         pageBuilder: (_, __, ___) {
                                            //   return AdDetailPage(
                                            //     model: widget.model,
                                            //     adId: _ads[indexDetail++].id,
                                            //   );
                                            // }));
                                          },
                                          child: ProductCard(
                                            name: _ads[indexAd].name,
                                            image: _ads[indexAd].image,
                                            address: _ads[indexAd].location,
                                            isFav: _ads[indexAd].isFav,
                                            date: _ads[indexAd].since,
                                            price: _ads[indexAd++].price,
                                          ),
                                        )
                                      ],
                                    );
                            } else {
                              return Container();
                            }
                          },
                        )

最佳答案

您可以使用Staggered Grid View轻松实现

这是您所需的示例代码

new StaggeredGridView.countBuilder(
    crossAxisCount: 2,
    itemCount: 10,
    itemBuilder: (BuildContext context, int index) => new Container(
      color: Colors.green,
      child: new Center(
        child: new CircleAvatar(
          backgroundColor: Colors.white,
          child: new Text('$index'),
        ),
      ),
    ),
    staggeredTileBuilder: (int index) => (index % 7 == 0)
        ? new StaggeredTile.count(2, 1)
        : new StaggeredTile.count(1, 1),
    mainAxisSpacing: 4.0,
    crossAxisSpacing: 4.0,
  )

enter image description here

关于flutter - 如何在GridView中每6个不同的项目渲染一个图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57902743/

相关文章:

flutter - 如何将 Widget 定位在 SingleChildScrollView 的底部?

flutter - just_audio - 完成后的音频播放器,从头开始

php - 未处理的异常 : FormatException: Unexpected character (at character 1) Flutter

flutter - Dart 是通过引用传递的吗?

dart - 在 Dart 中,给定一个类型名称,如何获取类型(类)本身?

dart - 使用包 :http/browser_client. dart 会导致有关镜像的警告

dart - 将数据/消息从 flutter 应用程序传递到其他应用程序

flutter - 创建可调整大小的 View ,当在 FLUTTER 中从角落和侧面捏或拖动时调整大小

flutter - 如何从 Flutter Searchdelegate 中删除飞溅

flutter - flutter 中的单子(monad)布局 Widget 和多子布局 Widget 有什么区别?