From d51800202ab004ae26deac59a98d9d01173ce647 Mon Sep 17 00:00:00 2001 From: Aayush <aap409@usask.ca> Date: Thu, 10 Mar 2022 22:21:41 -0600 Subject: [PATCH] "Home screen data with firebase" --- android/app/build.gradle | 2 +- ...services (4).json => google-services.json} | 0 lib/auth/sign_in.dart | 2 +- lib/main.dart | 19 +- lib/models/product_model.dart | 6 + lib/providers/product_provider.dart | 82 ++++++++ lib/screens/home_screens/home_screen.dart | 177 ++++++------------ .../product_overview/product_overview.dart | 5 +- lib/screens/home_screens/single_product.dart | 6 +- lib/widgets/single_item.dart | 2 +- pubspec.lock | 34 +++- pubspec.yaml | 9 +- 12 files changed, 196 insertions(+), 148 deletions(-) rename android/app/{google-services (4).json => google-services.json} (100%) create mode 100644 lib/models/product_model.dart create mode 100644 lib/providers/product_provider.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index f37b40c..1d327bd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' diff --git a/android/app/google-services (4).json b/android/app/google-services.json similarity index 100% rename from android/app/google-services (4).json rename to android/app/google-services.json diff --git a/lib/auth/sign_in.dart b/lib/auth/sign_in.dart index dceab15..cebee09 100644 --- a/lib/auth/sign_in.dart +++ b/lib/auth/sign_in.dart @@ -15,7 +15,7 @@ class _SignInState extends State<SignIn> { Future<void>_googleSignUp() async { try { final GoogleSignIn _googleSignIn = GoogleSignIn( - scopes: ['email'], + scopes: ['email','https://www.googleapis.com/auth/contacts.readonly', ], ); final FirebaseAuth _auth = FirebaseAuth.instance; diff --git a/lib/main.dart b/lib/main.dart index a943aff..7632266 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,11 +3,13 @@ import 'package:flutter/material.dart'; import 'package:food_app/auth/sign_in.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:food_app/config/colors.dart'; +import 'package:food_app/providers/product_provider.dart'; import 'package:food_app/screens/home_screens/home_screen.dart'; +import 'package:provider/provider.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - //await Firebase.initializeApp(); + await Firebase.initializeApp(); runApp(MyApp()); } @@ -15,12 +17,15 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - theme: ThemeData( - primaryColor: primaryColor, - scaffoldBackgroundColor: scaffoldBackgroundColor), - debugShowCheckedModeBanner: false, - home: HomeScreen(), + return ChangeNotifierProvider<ProductProvider>( + create: (context) => ProductProvider(), + child: MaterialApp( + theme: ThemeData( + primaryColor: primaryColor, + scaffoldBackgroundColor: scaffoldBackgroundColor), + debugShowCheckedModeBanner: false, + home: SignIn(), + ), ); } } diff --git a/lib/models/product_model.dart b/lib/models/product_model.dart new file mode 100644 index 0000000..5307db2 --- /dev/null +++ b/lib/models/product_model.dart @@ -0,0 +1,6 @@ +class ProductModel { + String productName; + String productImage; + int productPrice; + ProductModel({this.productImage, this.productName, this.productPrice}); +} diff --git a/lib/providers/product_provider.dart b/lib/providers/product_provider.dart new file mode 100644 index 0000000..dcc35f1 --- /dev/null +++ b/lib/providers/product_provider.dart @@ -0,0 +1,82 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/foundation.dart'; +import 'package:food_app/models/product_model.dart'; + +class ProductProvider with ChangeNotifier { + List<ProductModel> herbsProductList = []; + List<ProductModel> freshProductList = []; + List<ProductModel> rootProductList = []; + ProductModel productModel; + + fetchHerbsProductData() async { + List<ProductModel> newList = []; + QuerySnapshot value = + await FirebaseFirestore.instance.collection("HerbsProduct ").get(); + value.docs.forEach( + (element) { + productModel = ProductModel( + productImage: element.get("productImage"), + productName: element.get("productName"), + productPrice: element.get("productPrice"), + ); + newList.add(productModel); + }, + ); + herbsProductList = newList; + notifyListeners(); + } + + List<ProductModel> get getHerbsProductDataList { + return herbsProductList; + } + + fetchFreshProductData() async { + List<ProductModel> newList = []; + + QuerySnapshot value = await FirebaseFirestore.instance + .collection("FreshFruitsProduct ") + .get(); + + value.docs.forEach( + (element) { + productModel = ProductModel( + productImage: element.get("productImage"), + productName: element.get("productName"), + productPrice: element.get("productPrice"), + ); + newList.add(productModel); + }, + ); + freshProductList = newList; + notifyListeners(); + } + + List<ProductModel> get getFreshProductDataList { + return freshProductList; + } + + fetchRootProductData() async { + List<ProductModel> newList = []; + + QuerySnapshot value = await FirebaseFirestore.instance + .collection("RootVegetablesProduct ") + .get(); + + value.docs.forEach( + (element) { + productModel = ProductModel( + productImage: element.get("productImage"), + productName: element.get("productName"), + productPrice: element.get("productPrice"), + ); + newList.add(productModel); + }, + ); + rootProductList = newList; + notifyListeners(); + } + + List<ProductModel> get getRootProductDataList { + return rootProductList; + } +} diff --git a/lib/screens/home_screens/home_screen.dart b/lib/screens/home_screens/home_screen.dart index 026a0d5..255d0b0 100644 --- a/lib/screens/home_screens/home_screen.dart +++ b/lib/screens/home_screens/home_screen.dart @@ -1,12 +1,22 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:food_app/providers/product_provider.dart'; import 'package:food_app/screens/home_screens/drawer_side.dart'; import 'package:food_app/config/colors.dart'; import 'package:food_app/screens/home_screens/product_overview/product_overview.dart'; import 'package:food_app/screens/home_screens/single_product.dart'; import 'package:food_app/screens/search/search.dart'; +import 'package:provider/provider.dart'; + +class HomeScreen extends StatefulWidget { + @override + State<HomeScreen> createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State<HomeScreen> { + ProductProvider productProvider; -class HomeScreen extends StatelessWidget { Widget _buildHerbsProduct(context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -27,56 +37,30 @@ class HomeScreen extends StatelessWidget { SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( - children: [ - SingleProduct( + children: productProvider.getHerbsProductDataList.map((herbsProductData) { + return SingleProduct( onTap: () { Navigator.of(context).push( MaterialPageRoute( builder: (context) => ProductOverview( - productName: "Fresh Basil", + productPrice: herbsProductData.productPrice, + productName: herbsProductData.productName, productImage: - 'https://www.pngitem.com/pimgs/m/490-4903879_fresh-basil-leaf-png-transparent-png.png', + herbsProductData.productImage, ), ), ); }, + productPrice: herbsProductData.productPrice, productImage: - 'https://www.pngitem.com/pimgs/m/490-4903879_fresh-basil-leaf-png-transparent-png.png', - productName: "Fresh Basil", - ), - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Fresh Mint", - productImage: - 'https://i.dlpng.com/static/png/5560435-peppermint-transparent-image-png-arts-peppermint-png-1200_900_preview.png', - ), - ), - ); - }, - productImage: - 'https://i.dlpng.com/static/png/5560435-peppermint-transparent-image-png-arts-peppermint-png-1200_900_preview.png', - productName: "Fresh Mint", - ), - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Rose Mary", - productImage: - 'https://www.pngarts.com/files/5/Rosemary-PNG-Transparent-Image.png', - ), - ), - ); - }, - productImage: - 'https://www.pngarts.com/files/5/Rosemary-PNG-Transparent-Image.png', - productName: "Rose Mary", - ) - ], + herbsProductData.productImage, + productName: herbsProductData.productName, + ); + }, + ).toList(), + // children: [ + + // ], ), ), ], @@ -103,56 +87,27 @@ class HomeScreen extends StatelessWidget { SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( - children: [ - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Fresh Berries", - productImage: - 'https://www.kindpng.com/picc/m/191-1916425_berries-png-file-download-free-mixed-berries-fruit.png', - ), - ), - ); - }, - productImage: - 'https://www.kindpng.com/picc/m/191-1916425_berries-png-file-download-free-mixed-berries-fruit.png', - productName: "Fresh Berries", - ), - SingleProduct( + children: productProvider.getFreshProductDataList.map((freshProductData) { + return SingleProduct( onTap: () { Navigator.of(context).push( MaterialPageRoute( builder: (context) => ProductOverview( - productName: "Watermelon", + productPrice: freshProductData.productPrice, + productName: freshProductData.productName, productImage: - 'https://e1.pngegg.com/pngimages/832/291/png-clipart-fruit-sliced-watermelon.png', + freshProductData.productImage, ), ), ); }, + productPrice: freshProductData.productPrice, productImage: - 'https://e1.pngegg.com/pngimages/832/291/png-clipart-fruit-sliced-watermelon.png', - productName: "Watermelon", - ), - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Mangoes", - productImage: - 'https://www.nicepng.com/png/detail/852-8528360_mango-png-image-mango-clipart-fruit.png', - ), - ), - ); - }, - productImage: - 'https://www.nicepng.com/png/detail/852-8528360_mango-png-image-mango-clipart-fruit.png', - productName: "Mangoes", - ) - ], + freshProductData.productImage, + productName: freshProductData.productName, + ); + }, + ).toList(), ), ), ], @@ -179,64 +134,44 @@ class HomeScreen extends StatelessWidget { SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( - children: [ - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Fennel", - productImage: - 'https://www.fondation-louisbonduelle.org/wp-content/uploads/2016/09/fenouil_262755635-e1475226317736.png', - ), - ), - ); - }, - productImage: - 'https://www.fondation-louisbonduelle.org/wp-content/uploads/2016/09/fenouil_262755635-e1475226317736.png', - productName: "Fennel", - ), - SingleProduct( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ProductOverview( - productName: "Beet Root", - productImage: - 'https://www.nicepng.com/png/detail/50-508075_free-png-beet-png-images-transparent-red-beetroot.png', - ), - ), - ); - }, - productImage: - 'https://www.nicepng.com/png/detail/50-508075_free-png-beet-png-images-transparent-red-beetroot.png', - productName: "Beet Root", - ), - SingleProduct( + children: productProvider.getRootProductDataList.map((rootProductData) { + return SingleProduct( onTap: () { Navigator.of(context).push( MaterialPageRoute( builder: (context) => ProductOverview( - productName: "Turnip", + productPrice: rootProductData.productPrice, + productName: rootProductData.productName, productImage: - 'https://purepng.com/public/uploads/large/purepng.com-turnipvegetables-root-vegetable-rutabaga-swede-turnip-neep-941524702928b62ft.png', + rootProductData.productImage, ), ), ); }, + productPrice: rootProductData.productPrice, productImage: - 'https://purepng.com/public/uploads/large/purepng.com-turnipvegetables-root-vegetable-rutabaga-swede-turnip-neep-941524702928b62ft.png', - productName: "Turnip", - ) - ], + rootProductData.productImage, + productName: rootProductData.productName, + ); + }, + ).toList(), ), ), ], ); } + @override + void initState() { + ProductProvider productProvider = Provider.of(context, listen: false); + productProvider.fetchHerbsProductData(); + super.initState(); + } + @override Widget build(BuildContext context) { + productProvider = Provider.of(context); + return Scaffold( drawer: DrawerSide(), appBar: AppBar( diff --git a/lib/screens/home_screens/product_overview/product_overview.dart b/lib/screens/home_screens/product_overview/product_overview.dart index 76b96b7..5ce4984 100644 --- a/lib/screens/home_screens/product_overview/product_overview.dart +++ b/lib/screens/home_screens/product_overview/product_overview.dart @@ -6,7 +6,8 @@ enum SigninCharacter { fill, outline } class ProductOverview extends StatefulWidget { final String productName; final String productImage; - ProductOverview({this.productImage, this.productName}); + final int productPrice; + ProductOverview({this.productImage, this.productName, this.productPrice}); @override _ProductOverviewState createState() => _ProductOverviewState(); @@ -123,7 +124,7 @@ class _ProductOverviewState extends State<ProductOverview> { ) ], ), - Text("\$50"), + Text("\$${widget.productPrice}"), Container( padding: EdgeInsets.symmetric( horizontal: 30, diff --git a/lib/screens/home_screens/single_product.dart b/lib/screens/home_screens/single_product.dart index d88c747..cd7604a 100644 --- a/lib/screens/home_screens/single_product.dart +++ b/lib/screens/home_screens/single_product.dart @@ -4,8 +4,10 @@ import 'package:food_app/config/colors.dart'; class SingleProduct extends StatelessWidget { final String productImage; final String productName; + final int productPrice; final Function onTap; - SingleProduct({this.productImage, this.productName, this.onTap}); + SingleProduct( + {this.productImage, this.productName, this.onTap, this.productPrice}); @override Widget build(BuildContext context) { return SingleChildScrollView( @@ -48,7 +50,7 @@ class SingleProduct extends StatelessWidget { fontWeight: FontWeight.bold, ), ), - Text('50\$/50 Gram', + Text('$productPrice\$/50 Gram', style: TextStyle( color: Colors.grey, )), diff --git a/lib/widgets/single_item.dart b/lib/widgets/single_item.dart index 648770f..b2dd454 100644 --- a/lib/widgets/single_item.dart +++ b/lib/widgets/single_item.dart @@ -18,7 +18,7 @@ class SingleItem extends StatelessWidget { height: 100, child: Center( child: Image.network( - "https://www.pngitem.com/pimgs/m/490-4903879_fresh-basil-leaf-png-transparent-png.png"), + "https://purepng.com/public/uploads/large/purepng.com-pepermintpeperminthybrid-mintperennial-plantmint-14115270742872fda0.png"), ), ), ), diff --git a/pubspec.lock b/pubspec.lock index 83f220b..c5ea06f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -42,7 +42,7 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "2.5.4" + version: "3.1.10" cloud_firestore_platform_interface: dependency: transitive description: @@ -56,7 +56,7 @@ packages: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "2.6.9" + version: "2.6.10" collection: dependency: transitive description: @@ -84,42 +84,42 @@ packages: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "3.3.10" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.3.1" + version: "6.2.1" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "1.3.1" + version: "3.3.9" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.13.0" + version: "1.13.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.4" + version: "4.2.5" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.0" + version: "1.6.1" flutter: dependency: "direct main" description: flutter @@ -131,7 +131,7 @@ packages: name: flutter_signin_button url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "2.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -148,7 +148,7 @@ packages: name: font_awesome_flutter url: "https://pub.dartlang.org" source: hosted - version: "8.12.0" + version: "9.2.0" google_sign_in: dependency: "direct main" description: @@ -212,6 +212,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" path: dependency: transitive description: @@ -226,6 +233,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" quiver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b562c1d..765ac16 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,10 +34,13 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - flutter_signin_button: ^1.1.0 + flutter_signin_button: ^2.0.0 google_sign_in: ^5.0.2 - firebase_auth: ^1.1.0 - cloud_firestore: ^2.2.0 + firebase_auth: ^3.3.10 + cloud_firestore: ^3.1.10 + provider: ^6.0.2 + + dev_dependencies: flutter_test: sdk: flutter -- GitLab