Hi Friends,
Today we will see how to implement GridView in Flutter.
We are going to use this service for the data
First we will create a Model for the Grid Cell
class HomeCellVO { int id; String title; String icon; HomeCellVO({this.id, this.title, this.icon}); factory HomeCellVO.fromJson(Map<String, dynamic> json) { return HomeCellVO( id: json['id'] as int, title: json['title'] as String, icon: json['icon'] as String, ); } }
No we will create view for Grid Cell
Create a file named “cell.dart” and copy this into it.
import 'package:flutter/material.dart'; import 'home_cell.dart'; class Cell extends StatelessWidget { const Cell(this.homeCellVO); @required final HomeCellVO homeCellVO; @override Widget build(BuildContext context) { return Center( child: Container( child: new Column( children: <Widget>[ Image.network(homeCellVO.icon, width: 100.0, height: 100.0, alignment: Alignment.center, fit: BoxFit.cover), Text(homeCellVO.title), ], ), ), ); } }
Service Class
We have the below service class for fetching the data.
service.dart
import 'dart:async'; import 'dart:convert'; import 'home_cell.dart'; import 'constants.dart'; import 'package:http/http.dart' as http; class Services { static Future<List<HomeCellVO>> fetchHomeData() async { final response = await http.get(CONSTANTS.HOME_SERVICE_URL); if (response.statusCode == 200) { List<HomeCellVO> list = parsePostsForHome(response.body); return list; } else { throw Exception(CONSTANTS.INTERNET_ERROR); } } static List<HomeCellVO> parsePostsForHome(String responseBody) { final parsed = json.decode(responseBody).cast<Map<String, dynamic>>(); return parsed.map<HomeCellVO>((json) => HomeCellVO.fromJson(json)).toList(); } }
To read about the http implementation, please read this post.
Also we have a seperate file for constants called constants.dart
class CONSTANTS { static const String INTERNET_ERROR = "No Internet Connection"; static const HOME_SERVICE_URL = 'http://codemansion.co.in/test.json'; }
Implementation
Now the class that implements the GridView
home.dart
import 'package:flutter/material.dart'; import 'cell.dart'; import 'constants.dart'; import 'home_cell.dart'; import 'services.dart'; class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { List<HomeCellVO> homeCells = new List(); @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: Container( child: FutureBuilder<List<HomeCellVO>>( future: Services.fetchHomeData(), builder: (context, snapshot) { if (snapshot.hasData) { return new Padding( padding: new EdgeInsets.all(10.0), child: GridView.builder( itemCount: snapshot.data.length, gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2), itemBuilder: (BuildContext context, int index) { return new GestureDetector( child: Cell(snapshot.data[index]), onTap: () => gridClicked(index), ); }, ), ); } else if (snapshot.hasError) { return Text(CONSTANTS.INTERNET_ERROR); } }, ), )); } } gridClicked(int index) { print('gridClicked : $index'); }
gridClicked is the function for handling the clicks in the Grid.
Great, we are all done.
Thanks.
Please leave your valuable comments below this post.
nice one very helpfull