Flutter: Create Smart Home Page UI with material
Flutter
Material
UI
effect
page
home
In this blog, We will design a simple smart home page material design with device list in grid view and switch effect.
Start by creating a new Flutter project in either of VS Code or Android Studio. Replace the Flutter default counter application in main.dart
with your own stateful widget.
You should have something like this:
import 'package:flutter/material.dart'; import 'package:smarthomeui/pages/home.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Home(), ); } }
Before Create Home
stateful widget create home.dart file in home folder, then inside of it with the following code:
import 'dart:ffi'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class Home extends StatefulWidget { const Home({super.key}); @override State<Home> createState() => _HomeState(); } class _HomeState extends State<Home> { List Devices = [ ["Smart Lock", "assets/icons/lock.png", false], ["Smart Window", "assets/icons/window.png", false], ["Smart TV", "assets/icons/smart-tv.png", false ], ["Smart Fan", "assets/icons/fan.png", false], ["Smart Light", "assets/icons/light-bulb.png", true], ["Smart AC", "assets/icons/air-conditioner.png", false], ]; void powerSwitchChnaged(bool value, int index){ setState(() { Devices[index][2] = value; }); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey[200], body: SafeArea( child:Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 35.0, vertical: 25.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Icon(Icons.dashboard, size: 40, color: Colors.blueAccent,), Icon(Icons.person, size: 40, color: Colors.blueAccent) ], ) ), SizedBox(height: 20.0), Padding( padding: EdgeInsets.symmetric(horizontal: 35.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Welcome", style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), Text("DevhubSpot", style: TextStyle(fontSize: 35, color: Colors.blueAccent, fontWeight: FontWeight.bold)) ] ), ), SizedBox(height: 20.0), Padding( padding: EdgeInsets.symmetric(horizontal: 35.0), child: Text("Device List", style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)), ), Expanded( child: GridView.builder( itemCount: Devices.length, padding: EdgeInsets.all(20.0), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), itemBuilder: (context, index){ return Padding( padding: EdgeInsets.all(12.0), child: Container( decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(25.0) ), padding: EdgeInsets.symmetric(vertical: 25.0), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ // Icon(Icons.home, size: 50), Image.asset(Devices[index][1], height: 55), CupertinoSwitch( value: Devices[index][2], onChanged: (value) { powerSwitchChnaged(value, index);} ) ], ), Padding( padding: EdgeInsets.only(top: 30, left: 10, right: 10), child:Text(Devices[index][0], style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.w500),), ) ], ) ), ); } ) ) ], ), ) ); } }
Output:
Flutter
Material
UI
effect
page
home