Flutter GridView
Creating grid layouts in Flutter
🎯 What is GridView?
GridView displays items in a two-dimensional scrollable grid layout. It's ideal for photo galleries, product catalogs, or any content that looks better in rows and columns.
// Simple GridView example
GridView.count(
crossAxisCount: 2,
children: [
Container(color: Colors.red),
Container(color: Colors.blue),
],
)
Types of GridView
GridView.count
Fixed number of columns
GridView.count(
crossAxisCount: 3,
children: [
Text('Item 1'),
Text('Item 2'),
],
)
GridView.extent
Maximum tile width
GridView.extent(
maxCrossAxisExtent: 200,
children: [
Text('Item 1'),
Text('Item 2'),
],
)
GridView.builder
Efficient for large grids
GridView.builder(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
itemBuilder: (context, index) {
return Text('Item $index');
},
)
GridView.custom
Custom grid behavior
GridView.custom(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
childrenDelegate:
SliverChildBuilderDelegate(
(context, index) {
return Text('Item $index');
},
),
)
🔹 Basic GridView.count Example
Create a simple grid with a fixed number of columns:
import 'package:flutter/material.dart';
class MyGridView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Photo Grid')),
body: GridView.count(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
padding: EdgeInsets.all(10),
children: [
Container(
color: Colors.red,
child: Center(child: Text('Photo 1', style: TextStyle(color: Colors.white))),
),
Container(
color: Colors.blue,
child: Center(child: Text('Photo 2', style: TextStyle(color: Colors.white))),
),
Container(
color: Colors.green,
child: Center(child: Text('Photo 3', style: TextStyle(color: Colors.white))),
),
Container(
color: Colors.orange,
child: Center(child: Text('Photo 4', style: TextStyle(color: Colors.white))),
),
],
),
);
}
}
Output:
Photo 1
Photo 2
Photo 3
Photo 4
🔹 GridView.builder for Dynamic Grids
Use GridView.builder for efficient rendering of large grids:
class DynamicGridView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
childAspectRatio: 1,
),
itemCount: 20,
padding: EdgeInsets.all(8),
itemBuilder: (context, index) {
return Card(
elevation: 4,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.image, size: 40, color: Colors.blue),
SizedBox(height: 8),
Text('Item ${index + 1}'),
],
),
),
);
},
);
}
}
Output:
🖼️
Item 1
🖼️
Item 2
🖼️
Item 3
🖼️
Item 4
🖼️
Item 5
🖼️
Item 6
🔹 GridView.extent Example
Create a responsive grid with maximum tile width:
GridView.extent(
maxCrossAxisExtent: 150,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
padding: EdgeInsets.all(10),
children: List.generate(12, (index) {
return Container(
decoration: BoxDecoration(
color: Colors.primaries[index % Colors.primaries.length],
borderRadius: BorderRadius.circular(8),
),
child: Center(
child: Text(
'${index + 1}',
style: TextStyle(color: Colors.white, fontSize: 24),
),
),
);
}),
)
Output:
1
2
3
4
5
6
🔹 GridView Best Practices
Tips for using GridView:
- Use GridView.builder for large or dynamic grids
- Set childAspectRatio to control item dimensions
- Use GridView.extent for responsive layouts
- Add spacing with crossAxisSpacing and mainAxisSpacing
- Consider performance when displaying images