GridView的子元素大小取决于childAspectRatio
.如果您希望为itemBuilder提供不同的大小,则需要使用另一个小部件进行包装,该小部件将用于处理父约束.
class TestGrid extends StatelessWidget {
const TestGrid({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
final currentViewWidth = constraints.maxWidth;
final currentViewHeight = constraints.maxHeight;
bool isLargeScreen = currentViewWidth > 1200;
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
mainAxisSpacing: 16,
crossAxisSpacing: 8,
childAspectRatio: isLargeScreen ? 1.5 : 1.2, //handle the child size
crossAxisCount: isLargeScreen ? 4 : 2,
),
itemBuilder: (context, index) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
final width = constraints.maxWidth;
final height = constraints.maxHeight;
return Center(
//this will take the constraints of GridView.builder, which is comes from `childAspectRatio`
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(10),
),
child: ColoredBox(color: index.isEven ? Colors.red : Colors.blue, child: Text("$width x $height")),
),
);
},
);
},
);
},
),
);
}
}