在每显示六个网格项目之后,将网格项目显示为全宽的第七个网格
show grid item as seventh grid with full width after every shown six grid items
我正在从 api 中获取数据。我在 gridview 中列出这些数据。在每个 (index % 6 == 0)
之后,我想在网格视图中显示 seventh_item 和 crossAxisCount: 1
。如果 (index % 6 == 0)
不是 true,我想在网格视图中显示 any_item 和 crossAxisCount: 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);
}
});
}
}
输出:
我正在从 api 中获取数据。我在 gridview 中列出这些数据。在每个 (index % 6 == 0)
之后,我想在网格视图中显示 seventh_item 和 crossAxisCount: 1
。如果 (index % 6 == 0)
不是 true,我想在网格视图中显示 any_item 和 crossAxisCount: 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);
}
});
}
}
输出: