在每显示六个网格项目之后,将网格项目显示为全宽的第七个网格

show grid item as seventh grid with full width after every shown six grid items

我正在从 api 中获取数据。我在 gridview 中列出这些数据。在每个 (index % 6 == 0) 之后,我想在网格视图中显示 seventh_itemcrossAxisCount: 1。如果 (index % 6 == 0) 不是 true,我想在网格视图中显示 any_itemcrossAxisCount: 2

seventh_item = 广告横幅网格项目;

while__

any_item = 任何包含数据库数据的网格项。

 Expanded(
          child: FutureBuilder<List<Item>>(
            future: xtraDataAvailable == false
                ? fetchItems(0, 10)
                : fetchItems(skip, limit),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if (snapshot.data != null) {
                return NotificationListener(
                  child: GridView.builder(
                    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                      crossAxisCount: 2,
                    ),
                    itemCount:
                        _search.isEmpty ? itemsgrid.length : _search.length,
                    itemBuilder: (context, index) {
                      if (index != 0 && index % 6 == 0) {
                        return Container(
                          margin: EdgeInsets.only(bottom: 20.0),
                          // sevent_item, the banner has crossAxisCount: 1
                          child: Text('seventh_item'),
                          ),
                        );
                      } else {
                         // any_item, any item from db and has crossAxisCount: 2
                         return Container(child: Text('any_item')),
                    }
                  )
                )

注意 可能有更好的方法,比如在 gridview 中更新 crossAxisCount。我已经用 setstate 试过了,但它没有按预期工作。只是想让这个工作。谢谢。

您可以使用 StaggeredGridView 实现此 https://pub.dev/packages/flutter_staggered_grid_view#-readme-tab-

示例

class Staggered extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: StaggeredGridView.count(
          crossAxisCount: 2,
          mainAxisSpacing: 5,
          crossAxisSpacing: 5,
          children: List.generate(14, (index){
            return Container(
              child: Center(
                child: Text("${index+1}"),
              ),
              color: Colors.blue,
            );
          }),
          staggeredTiles: buildTiles(),
        ),
      ),
    );
  }

  List<StaggeredTile> buildTiles(){
    return List.generate(14, (index){
      if((index+1)%7 == 0){
        return StaggeredTile.count(2, 1);
      }else{
        return StaggeredTile.count(1, 1);
      }
    });
  }
}

输出: