From 84fef5767beff22bc769d977b7486009ea7a0b8e Mon Sep 17 00:00:00 2001 From: iampawan Date: Fri, 5 Feb 2021 18:22:21 +0530 Subject: [PATCH 01/13] day 5 completed --- lib/main.dart | 5 +- lib/pages/login_page.dart | 99 ++++++++++++++++++++------------------- lib/utils/routes.dart | 4 ++ 3 files changed, 58 insertions(+), 50 deletions(-) create mode 100644 lib/utils/routes.dart diff --git a/lib/main.dart b/lib/main.dart index 81f5db5..7ba9441 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_catalog/pages/login_page.dart'; +import 'package:flutter_catalog/utils/routes.dart'; import 'package:google_fonts/google_fonts.dart'; import 'pages/home_page.dart'; @@ -22,8 +23,8 @@ class MyApp extends StatelessWidget { initialRoute: "/", routes: { "/": (context) => LoginPage(), - "/home": (context) => HomePage(), - "/login": (context) => LoginPage() + MyRoutes.homeRoute: (context) => HomePage(), + MyRoutes.loginRoute: (context) => LoginPage() }, ); } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 73465b5..541acbc 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,61 +1,64 @@ import 'package:flutter/material.dart'; +import 'package:flutter_catalog/utils/routes.dart'; class LoginPage extends StatelessWidget { @override Widget build(BuildContext context) { return Material( color: Colors.white, - child: Column( - children: [ - Image.asset( - "assets/images/login_image.png", - fit: BoxFit.cover, - ), - SizedBox( - height: 20.0, - ), - Text( - "Welcome", - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, + child: SingleChildScrollView( + child: Column( + children: [ + Image.asset( + "assets/images/login_image.png", + fit: BoxFit.cover, ), - ), - SizedBox( - height: 20.0, - ), - Padding( - padding: - const EdgeInsets.symmetric(vertical: 16.0, horizontal: 32.0), - child: Column( - children: [ - TextFormField( - decoration: InputDecoration( - hintText: "Enter username", - labelText: "Username", + SizedBox( + height: 20.0, + ), + Text( + "Welcome", + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + ), + ), + SizedBox( + height: 20.0, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 16.0, horizontal: 32.0), + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + hintText: "Enter username", + labelText: "Username", + ), ), - ), - TextFormField( - obscureText: true, - decoration: InputDecoration( - hintText: "Enter password", - labelText: "Password", + TextFormField( + obscureText: true, + decoration: InputDecoration( + hintText: "Enter password", + labelText: "Password", + ), ), - ), - SizedBox( - height: 20.0, - ), - ElevatedButton( - child: Text("Login"), - style: TextButton.styleFrom(), - onPressed: () { - print("Hi Codepur"); - }, - ) - ], - ), - ) - ], + SizedBox( + height: 40.0, + ), + ElevatedButton( + child: Text("Login"), + style: TextButton.styleFrom(minimumSize: Size(150, 40)), + onPressed: () { + Navigator.pushNamed(context, MyRoutes.homeRoute); + }, + ) + ], + ), + ) + ], + ), )); } } diff --git a/lib/utils/routes.dart b/lib/utils/routes.dart new file mode 100644 index 0000000..510c16a --- /dev/null +++ b/lib/utils/routes.dart @@ -0,0 +1,4 @@ +class MyRoutes { + static String loginRoute = "/login"; + static String homeRoute = "/home"; +} From 0e57c79befdf26615e4491467a219b69d3538b70 Mon Sep 17 00:00:00 2001 From: iampawan Date: Sat, 6 Feb 2021 17:17:30 +0530 Subject: [PATCH 02/13] day 6 completed --- lib/pages/login_page.dart | 60 ++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 541acbc..2739751 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,7 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_catalog/utils/routes.dart'; -class LoginPage extends StatelessWidget { +class LoginPage extends StatefulWidget { + @override + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + String name = ""; + bool changeButton = false; + @override Widget build(BuildContext context) { return Material( @@ -17,7 +25,7 @@ class LoginPage extends StatelessWidget { height: 20.0, ), Text( - "Welcome", + "Welcome $name", style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, @@ -36,6 +44,10 @@ class LoginPage extends StatelessWidget { hintText: "Enter username", labelText: "Username", ), + onChanged: (value) { + name = value; + setState(() {}); + }, ), TextFormField( obscureText: true, @@ -47,13 +59,47 @@ class LoginPage extends StatelessWidget { SizedBox( height: 40.0, ), - ElevatedButton( - child: Text("Login"), - style: TextButton.styleFrom(minimumSize: Size(150, 40)), - onPressed: () { + + InkWell( + onTap: () async { + setState(() { + changeButton = true; + }); + await Future.delayed(Duration(seconds: 1)); Navigator.pushNamed(context, MyRoutes.homeRoute); }, - ) + child: AnimatedContainer( + duration: Duration(seconds: 1), + width: changeButton ? 50 : 150, + height: 50, + alignment: Alignment.center, + child: changeButton + ? Icon( + Icons.done, + color: Colors.white, + ) + : Text( + "Login", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + decoration: BoxDecoration( + color: Colors.deepPurple, + borderRadius: + BorderRadius.circular(changeButton ? 50 : 8), + ), + ), + ), + + // ElevatedButton( + // child: Text("Login"), + // style: TextButton.styleFrom(minimumSize: Size(150, 40)), + // onPressed: () { + // Navigator.pushNamed(context, MyRoutes.homeRoute); + // }, + // ) ], ), ) From e7578cffb012838d1051c85b0766169821e918a0 Mon Sep 17 00:00:00 2001 From: iampawan Date: Mon, 8 Feb 2021 16:55:37 +0530 Subject: [PATCH 03/13] Day 8 completed --- assets/images/hey.png | Bin 0 -> 49839 bytes lib/pages/login_page.dart | 185 +++++++++++++++++++++----------------- 2 files changed, 102 insertions(+), 83 deletions(-) create mode 100644 assets/images/hey.png diff --git a/assets/images/hey.png b/assets/images/hey.png new file mode 100644 index 0000000000000000000000000000000000000000..caeca234ec31e9b3457e1a33b133c391358fc6dd GIT binary patch literal 49839 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 q+2UWi{)=G$I-dV#i+?HceiNQqaxs|$&7n* { String name = ""; bool changeButton = false; + final _formKey = GlobalKey(); + + moveToHome(BuildContext context) async { + if (_formKey.currentState.validate()) { + setState(() { + changeButton = true; + }); + await Future.delayed(Duration(seconds: 1)); + await Navigator.pushNamed(context, MyRoutes.homeRoute); + setState(() { + changeButton = false; + }); + } + } + @override Widget build(BuildContext context) { return Material( color: Colors.white, child: SingleChildScrollView( - child: Column( - children: [ - Image.asset( - "assets/images/login_image.png", - fit: BoxFit.cover, - ), - SizedBox( - height: 20.0, - ), - Text( - "Welcome $name", - style: TextStyle( - fontSize: 28, - fontWeight: FontWeight.bold, + child: Form( + key: _formKey, + child: Column( + children: [ + Image.asset( + "assets/images/hey.png", + fit: BoxFit.cover, ), - ), - SizedBox( - height: 20.0, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - child: Column( - children: [ - TextFormField( - decoration: InputDecoration( - hintText: "Enter username", - labelText: "Username", - ), - onChanged: (value) { - name = value; - setState(() {}); - }, - ), - TextFormField( - obscureText: true, - decoration: InputDecoration( - hintText: "Enter password", - labelText: "Password", + SizedBox( + height: 20.0, + ), + Text( + "Welcome $name", + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + ), + ), + SizedBox( + height: 20.0, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 16.0, horizontal: 32.0), + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + hintText: "Enter username", + labelText: "Username", + ), + validator: (value) { + if (value.isEmpty) { + return "Username cannot be empty"; + } + + return null; + }, + onChanged: (value) { + name = value; + setState(() {}); + }, ), - ), - SizedBox( - height: 40.0, - ), + TextFormField( + obscureText: true, + decoration: InputDecoration( + hintText: "Enter password", + labelText: "Password", + ), + validator: (value) { + if (value.isEmpty) { + return "Password cannot be empty"; + } else if (value.length < 6) { + return "Password length should be atleast 6"; + } - InkWell( - onTap: () async { - setState(() { - changeButton = true; - }); - await Future.delayed(Duration(seconds: 1)); - Navigator.pushNamed(context, MyRoutes.homeRoute); - }, - child: AnimatedContainer( - duration: Duration(seconds: 1), - width: changeButton ? 50 : 150, - height: 50, - alignment: Alignment.center, - child: changeButton - ? Icon( - Icons.done, - color: Colors.white, - ) - : Text( - "Login", - style: TextStyle( + return null; + }, + ), + SizedBox( + height: 40.0, + ), + Material( + color: Colors.deepPurple, + borderRadius: + BorderRadius.circular(changeButton ? 50 : 8), + child: InkWell( + onTap: () => moveToHome(context), + child: AnimatedContainer( + duration: Duration(seconds: 1), + width: changeButton ? 50 : 150, + height: 50, + alignment: Alignment.center, + child: changeButton + ? Icon( + Icons.done, color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 18), - ), - decoration: BoxDecoration( - color: Colors.deepPurple, - borderRadius: - BorderRadius.circular(changeButton ? 50 : 8), + ) + : Text( + "Login", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ), ), ), - ), - - // ElevatedButton( - // child: Text("Login"), - // style: TextButton.styleFrom(minimumSize: Size(150, 40)), - // onPressed: () { - // Navigator.pushNamed(context, MyRoutes.homeRoute); - // }, - // ) - ], - ), - ) - ], + ], + ), + ) + ], + ), ), )); } From 06cf8dc54890a9f5987d4c18cf87adc85210e5cc Mon Sep 17 00:00:00 2001 From: iampawan Date: Tue, 9 Feb 2021 18:55:16 +0530 Subject: [PATCH 04/13] Dau 9 complered --- lib/main.dart | 3 +- lib/pages/home_page.dart | 3 +- lib/widgets/drawer.dart | 70 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 lib/widgets/drawer.dart diff --git a/lib/main.dart b/lib/main.dart index 7ba9441..9ea57bb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,7 +20,8 @@ class MyApp extends StatelessWidget { darkTheme: ThemeData( brightness: Brightness.dark, ), - initialRoute: "/", + debugShowCheckedModeBanner: false, + initialRoute: MyRoutes.homeRoute, routes: { "/": (context) => LoginPage(), MyRoutes.homeRoute: (context) => HomePage(), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 487caed..43112ee 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_catalog/widgets/drawer.dart'; class HomePage extends StatelessWidget { final int days = 30; @@ -14,7 +15,7 @@ class HomePage extends StatelessWidget { child: Text("Welcome to $days days of flutter by $name"), ), ), - drawer: Drawer(), + drawer: MyDrawer(), ); } } diff --git a/lib/widgets/drawer.dart b/lib/widgets/drawer.dart new file mode 100644 index 0000000..298d27b --- /dev/null +++ b/lib/widgets/drawer.dart @@ -0,0 +1,70 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class MyDrawer extends StatelessWidget { + @override + Widget build(BuildContext context) { + final imageUrl = + "https://avatars.githubusercontent.com/u/12619420?s=460&u=26db98cbde1dd34c7c67b85c240505a436b2c36d&v=4"; + return Drawer( + child: Container( + color: Colors.deepPurple, + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + padding: EdgeInsets.zero, + child: UserAccountsDrawerHeader( + margin: EdgeInsets.zero, + accountName: Text("Pawan Kumar"), + accountEmail: Text("mtechviral@gmail.com"), + currentAccountPicture: CircleAvatar( + backgroundImage: NetworkImage(imageUrl), + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.home, + color: Colors.white, + ), + title: Text( + "Home", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.profile_circled, + color: Colors.white, + ), + title: Text( + "Profile", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.mail, + color: Colors.white, + ), + title: Text( + "Email me", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ) + ], + ), + ), + ); + } +} From 7ca256153a3c6f8da0bd859aa5321ae12363cc0d Mon Sep 17 00:00:00 2001 From: iampawan Date: Wed, 10 Feb 2021 19:37:45 +0530 Subject: [PATCH 05/13] themes extracted --- lib/main.dart | 11 +++-------- lib/widgets/themes.dart | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 lib/widgets/themes.dart diff --git a/lib/main.dart b/lib/main.dart index 9ea57bb..1091413 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_catalog/pages/login_page.dart'; import 'package:flutter_catalog/utils/routes.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'pages/home_page.dart'; +import 'widgets/themes.dart'; void main() { runApp(MyApp()); @@ -13,13 +13,8 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( themeMode: ThemeMode.light, - theme: ThemeData( - primarySwatch: Colors.deepPurple, - fontFamily: GoogleFonts.lato().fontFamily, - ), - darkTheme: ThemeData( - brightness: Brightness.dark, - ), + theme: MyTheme.lightTheme(context), + darkTheme: MyTheme.darkTheme(context), debugShowCheckedModeBanner: false, initialRoute: MyRoutes.homeRoute, routes: { diff --git a/lib/widgets/themes.dart b/lib/widgets/themes.dart new file mode 100644 index 0000000..158a8d1 --- /dev/null +++ b/lib/widgets/themes.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class MyTheme { + static ThemeData lightTheme(BuildContext context) => ThemeData( + primarySwatch: Colors.deepPurple, + fontFamily: GoogleFonts.lato().fontFamily, + appBarTheme: AppBarTheme( + color: Colors.white, + elevation: 0.0, + iconTheme: IconThemeData(color: Colors.black), + textTheme: Theme.of(context).textTheme, + )); + + static ThemeData darkTheme(BuildContext context) => ThemeData( + brightness: Brightness.dark, + ); +} From 02f7ca0a43705d89ef9836eebec74ece6e331d93 Mon Sep 17 00:00:00 2001 From: iampawan Date: Wed, 10 Feb 2021 21:47:54 +0530 Subject: [PATCH 06/13] day 10 completed --- lib/models/catalog.dart | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lib/models/catalog.dart diff --git a/lib/models/catalog.dart b/lib/models/catalog.dart new file mode 100644 index 0000000..5986006 --- /dev/null +++ b/lib/models/catalog.dart @@ -0,0 +1,21 @@ +class Item { + final String id; + final String name; + final String desc; + final num price; + final String color; + final String image; + + Item({this.id, this.name, this.desc, this.price, this.color, this.image}); +} + +final products = [ + Item( + id: "Codepur001", + name: "iPhone 12 Pro", + desc: "Apple iPhone 12th generation", + price: 999, + color: "#33505a", + image: + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRISJ6msIu4AU9_M9ZnJVQVFmfuhfyJjEtbUm3ZK11_8IV9TV25-1uM5wHjiFNwKy99w0mR5Hk&usqp=CAc") +]; From dc0c49da4e4a608f37a2bddd738538bd4fb81b35 Mon Sep 17 00:00:00 2001 From: iampawan Date: Thu, 11 Feb 2021 18:55:03 +0530 Subject: [PATCH 07/13] Day 11 completed --- lib/pages/home_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 43112ee..75ce5be 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_catalog/widgets/drawer.dart'; +//* Day 11 we learned about context, constraints class HomePage extends StatelessWidget { final int days = 30; final String name = "Codepur"; From 1a6bd7235849cd87299375abd0eb8d5cad613f34 Mon Sep 17 00:00:00 2001 From: iampawan Date: Fri, 12 Feb 2021 19:33:42 +0530 Subject: [PATCH 08/13] Day 12 completed --- lib/models/catalog.dart | 26 ++++++++++++++------------ lib/pages/home_page.dart | 16 ++++++++++++---- lib/widgets/item_widget.dart | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 lib/widgets/item_widget.dart diff --git a/lib/models/catalog.dart b/lib/models/catalog.dart index 5986006..da10336 100644 --- a/lib/models/catalog.dart +++ b/lib/models/catalog.dart @@ -1,5 +1,18 @@ +class CatalogModel { + static final items = [ + Item( + id: 1, + name: "iPhone 12 Pro", + desc: "Apple iPhone 12th generation", + price: 999, + color: "#33505a", + image: + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRISJ6msIu4AU9_M9ZnJVQVFmfuhfyJjEtbUm3ZK11_8IV9TV25-1uM5wHjiFNwKy99w0mR5Hk&usqp=CAc") + ]; +} + class Item { - final String id; + final int id; final String name; final String desc; final num price; @@ -8,14 +21,3 @@ class Item { Item({this.id, this.name, this.desc, this.price, this.color, this.image}); } - -final products = [ - Item( - id: "Codepur001", - name: "iPhone 12 Pro", - desc: "Apple iPhone 12th generation", - price: 999, - color: "#33505a", - image: - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRISJ6msIu4AU9_M9ZnJVQVFmfuhfyJjEtbUm3ZK11_8IV9TV25-1uM5wHjiFNwKy99w0mR5Hk&usqp=CAc") -]; diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 75ce5be..16f1ec8 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,19 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:flutter_catalog/models/catalog.dart'; import 'package:flutter_catalog/widgets/drawer.dart'; +import 'package:flutter_catalog/widgets/item_widget.dart'; -//* Day 11 we learned about context, constraints class HomePage extends StatelessWidget { final int days = 30; final String name = "Codepur"; @override Widget build(BuildContext context) { + final dummyList = List.generate(20, (index) => CatalogModel.items[0]); return Scaffold( appBar: AppBar( title: Text("Catalog App"), ), - body: Center( - child: Container( - child: Text("Welcome to $days days of flutter by $name"), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: ListView.builder( + itemCount: dummyList.length, + itemBuilder: (context, index) { + return ItemWidget( + item: dummyList[index], + ); + }, ), ), drawer: MyDrawer(), diff --git a/lib/widgets/item_widget.dart b/lib/widgets/item_widget.dart new file mode 100644 index 0000000..7bc5396 --- /dev/null +++ b/lib/widgets/item_widget.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/models/catalog.dart'; + +class ItemWidget extends StatelessWidget { + final Item item; + + const ItemWidget({Key key, @required this.item}) + : assert(item != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + child: ListTile( + onTap: () { + print("${item.name} pressed"); + }, + leading: Image.network(item.image), + title: Text(item.name), + subtitle: Text(item.desc), + trailing: Text( + "\$${item.price}", + textScaleFactor: 1.5, + style: TextStyle( + color: Colors.deepPurple, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } +} From 1d481bf2385d19120e01f5c3ce7817f0d7083cc1 Mon Sep 17 00:00:00 2001 From: iampawan Date: Sat, 13 Feb 2021 15:37:10 +0530 Subject: [PATCH 09/13] day13 completed --- assets/files/catalog.json | 68 +++++++++++++++++++++++++++++++++++++++ lib/pages/home_page.dart | 25 +++++++++++++- pubspec.yaml | 1 + 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 assets/files/catalog.json diff --git a/assets/files/catalog.json b/assets/files/catalog.json new file mode 100644 index 0000000..a86aa8a --- /dev/null +++ b/assets/files/catalog.json @@ -0,0 +1,68 @@ +{ + "products": [ + { + "id": 1, + "name": "iPhone 12 Pro", + "desc": "Apple iPhone 12th generation", + "price": 999, + "color": "#33505a", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRISJ6msIu4AU9_M9ZnJVQVFmfuhfyJjEtbUm3ZK11_8IV9TV25-1uM5wHjiFNwKy99w0mR5Hk&usqp=CAc" + }, + { + "id": 2, + "name": "Pixel 5", + "desc": "Google Pixel phone 5th generation", + "price": 699, + "color": "#00ac51", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSd0JhwLvm_uLDLc-la7hK9WyVpe9naJFcebKfhcICiq2KtvXDePNAU_9QO06LPcQ0K0fLByc7m&usqp=CAc" + }, + { + "id": 3, + "name": "M1 Macbook Air", + "desc": "Apple Macbook air with apple silicon", + "price": 1099, + "color": "#e0bfae", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSMOMstwtmLnjFb3NHiDJ_kcQnueNVH-rv_3ps96HZmXlFumKWaiBqq_L4Uoyx3iFiNTrXNEbyB&usqp=CAc" + }, + { + "id": 4, + "name": "Playstation 5", + "desc": "Sony Playstation 5th generation", + "price": 500, + "color": "#544ee4", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSMOMstwtmLnjFb3NHiDJ_kcQnueNVH-rv_3ps96HZmXlFumKWaiBqq_L4Uoyx3iFiNTrXNEbyB&usqp=CAc" + }, + { + "id": 5, + "name": "Airpods Pro", + "desc": "Apple Aipods Pro 1st generation", + "price": 200, + "color": "#e3e4e9", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQROEs084z65psoo06zYl5R0tUzywOVKVQZzmzqCj3PDP1vVJTWv3gGwGMFENSy4qV4n7sEQjE&usqp=CAc" + }, + { + "id": 6, + "name": "iPad Pro", + "desc": "Apple iPad Pro 2020 edition", + "price": 799, + "color": "#f73984", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNzUeRQ5uH7E3hpECib8qxdhfHv6SnUGT7mOsew_xiOoqRR7ZpdH-TQ4J6-HuIEfqHimYyPXWH&usqp=CAc" + }, + { + "id": 7, + "name": "Galaxy S21 Ultra", + "desc": "Samsung Galaxy S21 Ultra 2021 edition", + "price": 1299, + "color": "#1c1c1c", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTT_PZcc0wicVYR992s5QCIDLYy8t-z-9kibTUdWZBN2sd86aaqdAJfhvxAwZNWV9wfdzDikpr1&usqp=CAc" + }, + { + "id": 8, + "name": "Galaxy S21", + "desc": "Samsung Galaxy S21 2021 edition", + "price": 899, + "color": "#7c95eb", + "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBNHd7FwarbxA1xdMFt24KazjcR4dWPH_t_T5dz4YNK1s7rJAQ8gOIuR_NRw6eeiQgFhbZ9sAN&usqp=CAc" + } + ] +} \ No newline at end of file diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 16f1ec8..9db00ed 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,11 +1,34 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'dart:convert'; import 'package:flutter_catalog/models/catalog.dart'; import 'package:flutter_catalog/widgets/drawer.dart'; import 'package:flutter_catalog/widgets/item_widget.dart'; -class HomePage extends StatelessWidget { +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { final int days = 30; + final String name = "Codepur"; + + @override + void initState() { + super.initState(); + loadData(); + } + + loadData() async { + final catalogJson = + await rootBundle.loadString("assets/files/catalog.json"); + final decodedData = jsonDecode(catalogJson); + var productsData = decodedData["products"]; + print(productsData); + } + @override Widget build(BuildContext context) { final dummyList = List.generate(20, (index) => CatalogModel.items[0]); diff --git a/pubspec.yaml b/pubspec.yaml index baebcf5..077b911 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/images/ + - assets/files/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see From da37eea6a4908a4900c8d0dc3c353d6eb0086cb5 Mon Sep 17 00:00:00 2001 From: iampawan Date: Tue, 16 Feb 2021 19:50:21 +0530 Subject: [PATCH 10/13] fixes --- integration_test/app_test.dart | 2 +- ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + pubspec.lock | 184 ++++----------------------------- 4 files changed, 25 insertions(+), 163 deletions(-) diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index bbf8055..51fd2f5 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -11,7 +11,7 @@ import 'package:integration_test/integration_test.dart'; import 'package:flutter_catalog/main.dart' as app; -void main() => run(_testMain); +// void main() => run(_testMain); void _testMain() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index e8efba1..b2f5fae 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 399e934..88c2914 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/pubspec.lock b/pubspec.lock index 479a041..146e4d1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,20 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "12.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "0.40.6" archive: dependency: transitive description: @@ -35,49 +21,42 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.3" + version: "2.5.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.5" + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" + version: "1.2.0" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.5" + version: "1.15.0" convert: dependency: transitive description: @@ -85,13 +64,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "0.14.2" crypto: dependency: transitive description: @@ -112,7 +84,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" + version: "1.2.0" ffi: dependency: transitive description: @@ -126,7 +98,7 @@ packages: name: file url: "https://pub.dartlang.org" source: hosted - version: "6.0.0-nullsafety.4" + version: "6.0.0" flutter: dependency: "direct main" description: flutter @@ -147,13 +119,6 @@ packages: description: flutter source: sdk version: "0.0.0" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" google_fonts: dependency: "direct main" description: @@ -180,76 +145,27 @@ packages: description: flutter source: sdk version: "0.9.2+2" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.4" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3-nullsafety.3" - json_rpc_2: - dependency: transitive - description: - name: json_rpc_2 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.2" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "0.11.4" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.3" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.6" - node_interop: - dependency: transitive - description: - name: node_interop - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - node_io: - dependency: transitive - description: - name: node_io - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.3" + version: "1.3.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.3" + version: "1.8.0" path_provider: dependency: transitive description: @@ -298,7 +214,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.4" + version: "3.0.0" plugin_platform_interface: dependency: transitive description: @@ -306,74 +222,46 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.3" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0-nullsafety.3" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.0.0-nullsafety.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.4" + version: "4.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0-nullsafety.4" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10-nullsafety.3" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.4" + version: "1.8.0" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.6" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" sync_http: dependency: transitive description: @@ -387,35 +275,28 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.6" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.12-nullsafety.9" + version: "0.2.19" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.5" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.5" + version: "2.1.0" vm_service: dependency: transitive description: @@ -423,20 +304,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.7+15" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" webdriver: dependency: transitive description: @@ -458,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.1" sdks: dart: ">=2.12.0-0.0 <3.0.0" - flutter: ">=1.17.0 <2.0.0" + flutter: ">=1.17.0" From 5b9ec55190895f714dbe0340c942854378d62200 Mon Sep 17 00:00:00 2001 From: iampawan Date: Tue, 16 Feb 2021 20:46:58 +0530 Subject: [PATCH 11/13] day 15 completed --- lib/models/catalog.dart | 96 +++++++++++++++++++++++++++++++++++----- lib/pages/home_page.dart | 25 ++++++----- 2 files changed, 100 insertions(+), 21 deletions(-) diff --git a/lib/models/catalog.dart b/lib/models/catalog.dart index da10336..d13e24a 100644 --- a/lib/models/catalog.dart +++ b/lib/models/catalog.dart @@ -1,14 +1,7 @@ +import 'dart:convert'; + class CatalogModel { - static final items = [ - Item( - id: 1, - name: "iPhone 12 Pro", - desc: "Apple iPhone 12th generation", - price: 999, - color: "#33505a", - image: - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRISJ6msIu4AU9_M9ZnJVQVFmfuhfyJjEtbUm3ZK11_8IV9TV25-1uM5wHjiFNwKy99w0mR5Hk&usqp=CAc") - ]; + static List items; } class Item { @@ -19,5 +12,86 @@ class Item { final String color; final String image; - Item({this.id, this.name, this.desc, this.price, this.color, this.image}); + Item({ + this.id, + this.name, + this.desc, + this.price, + this.color, + this.image, + }); + + Item copyWith({ + int id, + String name, + String desc, + num price, + String color, + String image, + }) { + return Item( + id: id ?? this.id, + name: name ?? this.name, + desc: desc ?? this.desc, + price: price ?? this.price, + color: color ?? this.color, + image: image ?? this.image, + ); + } + + Map toMap() { + return { + 'id': id, + 'name': name, + 'desc': desc, + 'price': price, + 'color': color, + 'image': image, + }; + } + + factory Item.fromMap(Map map) { + if (map == null) return null; + + return Item( + id: map['id'], + name: map['name'], + desc: map['desc'], + price: map['price'], + color: map['color'], + image: map['image'], + ); + } + + String toJson() => json.encode(toMap()); + + factory Item.fromJson(String source) => Item.fromMap(json.decode(source)); + + @override + String toString() { + return 'Item(id: $id, name: $name, desc: $desc, price: $price, color: $color, image: $image)'; + } + + @override + bool operator ==(Object o) { + if (identical(this, o)) return true; + + return o is Item && + o.id == id && + o.name == name && + o.desc == desc && + o.price == price && + o.color == color && + o.image == image; + } + + @override + int get hashCode { + return id.hashCode ^ + name.hashCode ^ + desc.hashCode ^ + price.hashCode ^ + color.hashCode ^ + image.hashCode; + } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 9db00ed..30040c3 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -22,30 +22,35 @@ class _HomePageState extends State { } loadData() async { + await Future.delayed(Duration(seconds: 2)); final catalogJson = await rootBundle.loadString("assets/files/catalog.json"); final decodedData = jsonDecode(catalogJson); var productsData = decodedData["products"]; - print(productsData); + CatalogModel.items = List.from(productsData) + .map((item) => Item.fromMap(item)) + .toList(); + setState(() {}); } @override Widget build(BuildContext context) { - final dummyList = List.generate(20, (index) => CatalogModel.items[0]); return Scaffold( appBar: AppBar( title: Text("Catalog App"), ), body: Padding( padding: const EdgeInsets.all(16.0), - child: ListView.builder( - itemCount: dummyList.length, - itemBuilder: (context, index) { - return ItemWidget( - item: dummyList[index], - ); - }, - ), + child: (CatalogModel.items != null && CatalogModel.items.isNotEmpty) + ? ListView.builder( + itemCount: CatalogModel.items.length, + itemBuilder: (context, index) => ItemWidget( + item: CatalogModel.items[index], + ), + ) + : Center( + child: CircularProgressIndicator(), + ), ), drawer: MyDrawer(), ); From 1472bce27b0d2686dd4e03784bd34a6ecd9b88de Mon Sep 17 00:00:00 2001 From: iampawan Date: Tue, 16 Feb 2021 21:25:34 +0530 Subject: [PATCH 12/13] day 16 completed --- lib/pages/home_page.dart | 42 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 30040c3..b59ff85 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -42,11 +42,45 @@ class _HomePageState extends State { body: Padding( padding: const EdgeInsets.all(16.0), child: (CatalogModel.items != null && CatalogModel.items.isNotEmpty) - ? ListView.builder( - itemCount: CatalogModel.items.length, - itemBuilder: (context, index) => ItemWidget( - item: CatalogModel.items[index], + ? GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 16, + crossAxisSpacing: 16, ), + itemBuilder: (context, index) { + final item = CatalogModel.items[index]; + return Card( + clipBehavior: Clip.antiAlias, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + child: GridTile( + header: Container( + child: Text( + item.name, + style: TextStyle(color: Colors.white), + ), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.deepPurple, + ), + ), + child: Image.network( + item.image, + ), + footer: Container( + child: Text( + item.price.toString(), + style: TextStyle(color: Colors.white), + ), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.black, + ), + ), + )); + }, + itemCount: CatalogModel.items.length, ) : Center( child: CircularProgressIndicator(), From 0fb2488260640d010d1b7cd89a4078f439236ca8 Mon Sep 17 00:00:00 2001 From: Arpan Patel <47818179+arps18@users.noreply.github.com> Date: Sun, 21 Feb 2021 18:27:42 +0530 Subject: [PATCH 13/13] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index c3b927d..b80a9a4 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ A new Flutter project. +# Content of DAY 16 ([Tutorial](https://www.youtube.com/watch?v=K3CpuGVAFGc&list=PLrjrqTcKCnhTXI2GyPkaQF47inLp6LoIC&index=16)) + +- GridView +- GridTile + + ## Getting Started This project is a starting point for a Flutter application.