From d581382454b6c50084b65120a6f7e23c49f9b5fe Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Tue, 30 Mar 2021 23:05:25 +0200 Subject: [PATCH 1/8] messenger screen --- lib/main.dart | 3 +- lib/messenger_screen.dart | 242 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 lib/messenger_screen.dart diff --git a/lib/main.dart b/lib/main.dart index a35c77d..2b9e0e7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:udemy_flutter/login_screen.dart'; +import 'package:udemy_flutter/messenger_screen.dart'; void main() { @@ -21,7 +22,7 @@ class MyApp extends StatelessWidget { return MaterialApp( debugShowCheckedModeBanner: false, - home: LoginScreen(), + home: MessengerScreen(), ); } } \ No newline at end of file diff --git a/lib/messenger_screen.dart b/lib/messenger_screen.dart new file mode 100644 index 0000000..e731e43 --- /dev/null +++ b/lib/messenger_screen.dart @@ -0,0 +1,242 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class MessengerScreen extends StatelessWidget +{ + @override + Widget build(BuildContext context) + { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0.0, + titleSpacing: 20.0, + title: Row( + children: [ + CircleAvatar( + radius: 20.0, + backgroundImage: NetworkImage( + 'https://avatars.githubusercontent.com/u/34492145?v=4'), + ), + SizedBox( + width: 15.0, + ), + Text( + 'Chats', + style: TextStyle( + color: Colors.black, + ), + ), + ], + ), + actions: [ + IconButton( + icon: CircleAvatar( + radius: 15.0, + backgroundColor: Colors.blue, + child: Icon( + Icons.camera_alt, + size: 16.0, + color: Colors.white, + ), + ), + onPressed: () {}, + ), + IconButton( + icon: CircleAvatar( + radius: 15.0, + backgroundColor: Colors.blue, + child: Icon( + Icons.edit, + size: 16.0, + color: Colors.white, + ), + ), + onPressed: () {}, + ), + ], + ), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 5.0, + ), + color: Colors.grey[300], + ), + padding: EdgeInsets.all( + 5.0, + ), + child: Row( + children: [ + Icon( + Icons.search, + ), + SizedBox( + width: 15.0, + ), + Text( + 'Search', + ), + ], + ), + ), + SizedBox( + height: 20.0, + ), + Container( + height: 100.0, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) => buildStoryItem(), + separatorBuilder: (context, index) => SizedBox( + width: 20.0, + ), + itemCount: 5, + ), + ), + SizedBox( + height: 20.0, + ), + ListView.separated( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, index) => buildChatItem(), + separatorBuilder: (context, index) => SizedBox( + height: 20.0, + ), + itemCount: 15, + ), + ], + ), + ), + ), + ); + } + + // 1. build item + // 2. build list + // 3. add item to list + + + // arrow function + Widget buildChatItem() => + Row( + children: [ + Stack( + alignment: AlignmentDirectional.bottomEnd, + children: [ + CircleAvatar( + radius: 30.0, + backgroundImage: NetworkImage( + 'https://avatars.githubusercontent.com/u/34492145?v=4'), + ), + Padding( + padding: const EdgeInsetsDirectional.only( + bottom: 3.0, + end: 3.0, + ), + child: CircleAvatar( + radius: 7.0, + backgroundColor: Colors.red, + ), + ), + ], + ), + SizedBox( + width: 20.0, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Abdullah Ahmed Abdullah Ahmed Abdullah Ahmed Abdullah Ahmed', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + SizedBox( + height: 5.0, + ), + Row( + children: + [ + Expanded( + child: Text( + 'hello my name is abdullah ahmed hello my name is abdullah ahmed', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, + ), + child: Container( + width: 7.0, + height: 7.0, + decoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + ), + ), + Text( + '02:00 pm', + ), + ], + ), + ], + ), + ), + ], + ); + + Widget buildStoryItem() => + Container( + width: 60.0, + child: Column( + children: [ + Stack( + alignment: AlignmentDirectional.bottomEnd, + children: [ + CircleAvatar( + radius: 30.0, + backgroundImage: NetworkImage( + 'https://avatars.githubusercontent.com/u/34492145?v=4'), + ), + Padding( + padding: const EdgeInsetsDirectional.only( + bottom: 3.0, + end: 3.0, + ), + child: CircleAvatar( + radius: 7.0, + backgroundColor: Colors.red, + ), + ), + ], + ), + SizedBox( + height: 6.0, + ), + Text( + 'Abdullah Mansour Ali Mansour', + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); +} \ No newline at end of file From c1b8b58c73ebe3ec386b9cf1e5c79ef64308595d Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Tue, 30 Mar 2021 23:21:26 +0200 Subject: [PATCH 2/8] List View & Model Class --- lib/main.dart | 3 +- lib/users_screen.dart | 147 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 lib/users_screen.dart diff --git a/lib/main.dart b/lib/main.dart index 2b9e0e7..d9699c9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:udemy_flutter/login_screen.dart'; import 'package:udemy_flutter/messenger_screen.dart'; +import 'package:udemy_flutter/users_screen.dart'; void main() { @@ -22,7 +23,7 @@ class MyApp extends StatelessWidget { return MaterialApp( debugShowCheckedModeBanner: false, - home: MessengerScreen(), + home: UsersScreen(), ); } } \ No newline at end of file diff --git a/lib/users_screen.dart b/lib/users_screen.dart new file mode 100644 index 0000000..4bd9776 --- /dev/null +++ b/lib/users_screen.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; + +class UserModel { + final int id; + final String name; + final String phone; + + UserModel({ + @required this.id, + @required this.phone, + @required this.name, + }); +} + +class UsersScreen extends StatelessWidget { + List users = [ + UserModel( + id: 1, + name: 'Abdullah Mansour', + phone: '+201115342559', + ), + UserModel( + id: 2, + name: 'Osama Mansour', + phone: '+201117842559', + ), + UserModel( + id: 3, + name: 'Ahmed Ali', + phone: '+2087856136', + ), + UserModel( + id: 1, + name: 'Abdullah Mansour', + phone: '+201115342559', + ), + UserModel( + id: 2, + name: 'Osama Mansour', + phone: '+201117842559', + ), + UserModel( + id: 3, + name: 'Ahmed Ali', + phone: '+2087856136', + ), + UserModel( + id: 1, + name: 'Abdullah Mansour', + phone: '+201115342559', + ), + UserModel( + id: 2, + name: 'Osama Mansour', + phone: '+201117842559', + ), + UserModel( + id: 3, + name: 'Ahmed Ali', + phone: '+2087856136', + ), + UserModel( + id: 1, + name: 'Abdullah Mansour', + phone: '+201115342559', + ), + UserModel( + id: 2, + name: 'Osama Mansour', + phone: '+201117842559', + ), + UserModel( + id: 3, + name: 'Ahmed Ali', + phone: '+2087856136', + ), + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + 'Users', + ), + ), + body: ListView.separated( + itemBuilder: (context, index) => buildUserItem(users[index]), + separatorBuilder: (context, index) => Padding( + padding: const EdgeInsetsDirectional.only( + start: 20.0, + ), + child: Container( + width: double.infinity, + height: 1.0, + color: Colors.grey[300], + ), + ), + itemCount: users.length, + ), + ); + } + + Widget buildUserItem(UserModel user) => Padding( + padding: const EdgeInsets.all(20.0), + child: Row( + children: [ + CircleAvatar( + radius: 25.0, + child: Text( + '${user.id}', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox( + width: 20.0, + ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${user.name}', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + '${user.phone}', + style: TextStyle( + color: Colors.grey, + ), + ), + ], + ), + ], + ), + ); + +// 1. build item +// 2. build list +// 3. add item to list +} From 4f68bf6b2f2733a2d5a71d5fa9b1b163d335d82b Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Wed, 31 Mar 2021 08:13:00 +0200 Subject: [PATCH 3/8] StatefulWidget & StatelessWidget --- lib/counter_screen.dart | 84 +++++++++++++++++++++++++++++++++++++++++ lib/main.dart | 3 +- lib/users_screen.dart | 2 +- 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 lib/counter_screen.dart diff --git a/lib/counter_screen.dart b/lib/counter_screen.dart new file mode 100644 index 0000000..b5a4851 --- /dev/null +++ b/lib/counter_screen.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; + +// state less contain one class provide widget + +// state ful contain classes + +// 1. first class provide widget +// 2. second class provide state from this widget + +class CounterScreen extends StatefulWidget +{ + @override + _CounterScreenState createState() => _CounterScreenState(); +} + +class _CounterScreenState extends State +{ + int counter = 1; + + // 1. constructor + // 2. init state + // 3. build + + @override + void initState() + { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + 'Counter', + ), + ), + body: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + onPressed: () + { + setState(() + { + counter--; + print(counter); + }); + }, + child: Text( + 'MINUS', + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20.0, + ), + child: Text( + '$counter', + style: TextStyle( + fontSize: 50.0, + fontWeight: FontWeight.w900, + ), + ), + ), + TextButton( + onPressed: () + { + setState(() { + counter++; + print(counter); + }); + }, + child: Text( + 'PLUS', + ), + ), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index d9699c9..e810eae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:udemy_flutter/counter_screen.dart'; import 'package:udemy_flutter/login_screen.dart'; import 'package:udemy_flutter/messenger_screen.dart'; import 'package:udemy_flutter/users_screen.dart'; @@ -23,7 +24,7 @@ class MyApp extends StatelessWidget { return MaterialApp( debugShowCheckedModeBanner: false, - home: UsersScreen(), + home: CounterScreen(), ); } } \ No newline at end of file diff --git a/lib/users_screen.dart b/lib/users_screen.dart index 4bd9776..0ccc097 100644 --- a/lib/users_screen.dart +++ b/lib/users_screen.dart @@ -144,4 +144,4 @@ class UsersScreen extends StatelessWidget { // 1. build item // 2. build list // 3. add item to list -} +} \ No newline at end of file From 2c73ae51e80b725c5186267803fd91f4229d6fb2 Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Thu, 1 Apr 2021 00:03:58 +0200 Subject: [PATCH 4/8] bmi calculator --- lib/bmi_screen.dart | 274 ++++++++++++++++++++++++++++++++++++++++++++ lib/main.dart | 3 +- 2 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 lib/bmi_screen.dart diff --git a/lib/bmi_screen.dart b/lib/bmi_screen.dart new file mode 100644 index 0000000..d4d2c0f --- /dev/null +++ b/lib/bmi_screen.dart @@ -0,0 +1,274 @@ +import 'package:flutter/material.dart'; + +class BmiScreen extends StatefulWidget { + @override + _BmiScreenState createState() => _BmiScreenState(); +} + +class _BmiScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + 'BMI Calculator', + ), + ), + body: Column( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Row( + children: [ + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.ac_unit, + size: 70.0, + ), + SizedBox( + height: 15.0, + ), + Text( + 'MALE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, + ), + color: Colors.grey[400], + ), + ), + ), + SizedBox( + width: 20.0, + ), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.ac_unit, + size: 70.0, + ), + SizedBox( + height: 15.0, + ), + Text( + 'MALE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, + ), + color: Colors.grey[400], + ), + ), + ), + ], + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20.0, + ), + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'HEIGHT', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + mainAxisAlignment: MainAxisAlignment.center, + textBaseline: TextBaseline.alphabetic, + children: [ + Text( + '180', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.w900, + ), + ), + SizedBox( + width: 5.0, + ), + Text( + 'CM', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + Slider( + value: 120.0, + max: 220.0, + min: 80.0, + onChanged: (value) { + print(value.round()); + }, + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, + ), + color: Colors.grey[400], + ), + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Row( + children: [ + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'AGE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + '180', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.w900, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FloatingActionButton( + onPressed: () {}, + mini: true, + child: Icon( + Icons.remove, + ), + ), + FloatingActionButton( + onPressed: () {}, + mini: true, + child: Icon( + Icons.add, + ), + ), + ], + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, + ), + color: Colors.grey[400], + ), + ), + ), + SizedBox( + width: 20.0, + ), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'AGE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + '180', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.w900, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FloatingActionButton( + onPressed: () {}, + mini: true, + child: Icon( + Icons.remove, + ), + ), + FloatingActionButton( + onPressed: () {}, + mini: true, + child: Icon( + Icons.add, + ), + ), + ], + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, + ), + color: Colors.grey[400], + ), + ), + ), + ], + ), + ), + ), + Container( + width: double.infinity, + color: Colors.blue, + child: MaterialButton( + onPressed: () {}, + height: 50.0, + child: Text( + 'CALCULATE', + style: TextStyle( + color: Colors.white, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index e810eae..ae95b12 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:udemy_flutter/bmi_screen.dart'; import 'package:udemy_flutter/counter_screen.dart'; import 'package:udemy_flutter/login_screen.dart'; import 'package:udemy_flutter/messenger_screen.dart'; @@ -24,7 +25,7 @@ class MyApp extends StatelessWidget { return MaterialApp( debugShowCheckedModeBanner: false, - home: CounterScreen(), + home: BmiScreen(), ); } } \ No newline at end of file From 6591ab0b424236e04980b357da031400dc35a6c0 Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Thu, 1 Apr 2021 00:56:20 +0200 Subject: [PATCH 5/8] bmi calculator --- assets/images/female.png | Bin 0 -> 12749 bytes assets/images/male.png | Bin 0 -> 30262 bytes lib/bmi_result_screen.dart | 62 +++++++++++++ lib/bmi_screen.dart | 182 +++++++++++++++++++++++++------------ pubspec.yaml | 7 +- 5 files changed, 190 insertions(+), 61 deletions(-) create mode 100644 assets/images/female.png create mode 100644 assets/images/male.png create mode 100644 lib/bmi_result_screen.dart diff --git a/assets/images/female.png b/assets/images/female.png new file mode 100644 index 0000000000000000000000000000000000000000..8793274ac1d88ded85c0b9b11738f6c2bd5d3271 GIT binary patch literal 12749 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 literal 0 HcmV?d00001 diff --git a/assets/images/male.png b/assets/images/male.png new file mode 100644 index 0000000000000000000000000000000000000000..73b90640f6a71d3c25f09d3a08267edd9a132fe2 GIT binary patch literal 30262 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 literal 0 HcmV?d00001 diff --git a/lib/bmi_result_screen.dart b/lib/bmi_result_screen.dart new file mode 100644 index 0000000..2760678 --- /dev/null +++ b/lib/bmi_result_screen.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class BMIResultScreen extends StatelessWidget +{ + final int result; + final bool isMale; + final int age; + + BMIResultScreen({ + @required this.result, + @required this.age, + @required this.isMale, + }); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + onPressed: () + { + Navigator.pop(context); + }, + icon: Icon( + Icons.keyboard_arrow_left, + ), + ), + title: Text( + 'BMI Result', + ), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Gender : ${isMale ? 'Male' : 'Female'}', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Result : $result', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Age : $age', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/bmi_screen.dart b/lib/bmi_screen.dart index d4d2c0f..0d56b9e 100644 --- a/lib/bmi_screen.dart +++ b/lib/bmi_screen.dart @@ -1,4 +1,7 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; +import 'package:udemy_flutter/bmi_result_screen.dart'; class BmiScreen extends StatefulWidget { @override @@ -6,6 +9,12 @@ class BmiScreen extends StatefulWidget { } class _BmiScreenState extends State { + bool isMale = true; + double height = 120.0; + + int weight = 40; + int age = 20; + @override Widget build(BuildContext context) { return Scaffold( @@ -15,38 +24,47 @@ class _BmiScreenState extends State { ), ), body: Column( - children: [ + children: + [ Expanded( child: Padding( padding: const EdgeInsets.all(20.0), child: Row( children: [ Expanded( - child: Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.ac_unit, - size: 70.0, - ), - SizedBox( - height: 15.0, - ), - Text( - 'MALE', - style: TextStyle( - fontSize: 25.0, - fontWeight: FontWeight.bold, + child: GestureDetector( + onTap: () { + setState(() { + isMale = true; + }); + }, + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage('assets/images/male.png'), + height: 90.0, + width: 90.0, + ), + SizedBox( + height: 15.0, + ), + Text( + 'MALE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, ), - ], - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 10.0, + color: isMale ? Colors.blue : Colors.grey[400], ), - color: Colors.grey[400], ), ), ), @@ -54,31 +72,39 @@ class _BmiScreenState extends State { width: 20.0, ), Expanded( - child: Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.ac_unit, - size: 70.0, - ), - SizedBox( - height: 15.0, - ), - Text( - 'MALE', - style: TextStyle( - fontSize: 25.0, - fontWeight: FontWeight.bold, + child: GestureDetector( + onTap: () { + setState(() { + isMale = false; + }); + }, + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage('assets/images/female.png'), + height: 90.0, + width: 90.0, + ), + SizedBox( + height: 15.0, ), + Text( + 'FEMALE', + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10.0, ), - ], - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 10.0, + color: isMale ? Colors.grey[400] : Colors.blue, ), - color: Colors.grey[400], ), ), ), @@ -108,7 +134,7 @@ class _BmiScreenState extends State { textBaseline: TextBaseline.alphabetic, children: [ Text( - '180', + '${height.round()}', style: TextStyle( fontSize: 40.0, fontWeight: FontWeight.w900, @@ -127,11 +153,13 @@ class _BmiScreenState extends State { ], ), Slider( - value: 120.0, + value: height, max: 220.0, min: 80.0, onChanged: (value) { - print(value.round()); + setState(() { + height = value; + }); }, ), ], @@ -149,21 +177,22 @@ class _BmiScreenState extends State { child: Padding( padding: const EdgeInsets.all(20.0), child: Row( - children: [ + children: + [ Expanded( child: Container( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'AGE', + 'WEIGHT', style: TextStyle( fontSize: 25.0, fontWeight: FontWeight.bold, ), ), Text( - '180', + '$weight', style: TextStyle( fontSize: 40.0, fontWeight: FontWeight.w900, @@ -173,14 +202,24 @@ class _BmiScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ FloatingActionButton( - onPressed: () {}, + onPressed: () { + setState(() { + weight--; + }); + }, + heroTag: 'weight-', mini: true, child: Icon( Icons.remove, ), ), FloatingActionButton( - onPressed: () {}, + onPressed: () { + setState(() { + weight++; + }); + }, + heroTag: 'weight+', mini: true, child: Icon( Icons.add, @@ -214,7 +253,7 @@ class _BmiScreenState extends State { ), ), Text( - '180', + '$age', style: TextStyle( fontSize: 40.0, fontWeight: FontWeight.w900, @@ -224,14 +263,24 @@ class _BmiScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ FloatingActionButton( - onPressed: () {}, + onPressed: () { + setState(() { + age--; + }); + }, + heroTag: 'age-', mini: true, child: Icon( Icons.remove, ), ), FloatingActionButton( - onPressed: () {}, + onPressed: () { + setState(() { + age++; + }); + }, + heroTag: 'age+', mini: true, child: Icon( Icons.add, @@ -257,7 +306,21 @@ class _BmiScreenState extends State { width: double.infinity, color: Colors.blue, child: MaterialButton( - onPressed: () {}, + onPressed: () { + double result = weight / pow(height / 100, 2); + print(result.round()); + + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BMIResultScreen( + age: age, + isMale: isMale, + result: result.round(), + ), + ), + ); + }, height: 50.0, child: Text( 'CALCULATE', @@ -271,4 +334,7 @@ class _BmiScreenState extends State { ), ); } -} + +// var result = weight / pow(height / 100, 2); +// print(result.round()); +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index fb3f231..b856804 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,10 +44,11 @@ flutter: # the material Icons class. uses-material-design: true + assets: + - assets/images/ + # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. From 0033facab7c6a6ebf934cbba295ffc5e30d26c6d Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Thu, 1 Apr 2021 08:07:54 +0200 Subject: [PATCH 6/8] bmi calculator --- lib/main.dart | 12 ++--- lib/models/user/user_model.dart | 13 +++++ lib/{ => modules/bmi}/bmi_screen.dart | 2 +- .../bmi_result}/bmi_result_screen.dart | 0 lib/{ => modules/counter}/counter_screen.dart | 0 lib/{ => modules/home}/home_screen.dart | 0 lib/{ => modules/login}/login_screen.dart | 49 ++++++++++++------- .../messenger}/messenger_screen.dart | 0 lib/{ => modules/users}/users_screen.dart | 13 +---- lib/shared/components/components.dart | 29 +++++++++++ lib/shared/components/constants.dart | 0 lib/shared/styles/colors.dart | 0 lib/shared/styles/styles.dart | 0 13 files changed, 81 insertions(+), 37 deletions(-) create mode 100644 lib/models/user/user_model.dart rename lib/{ => modules/bmi}/bmi_screen.dart (99%) rename lib/{ => modules/bmi_result}/bmi_result_screen.dart (100%) rename lib/{ => modules/counter}/counter_screen.dart (100%) rename lib/{ => modules/home}/home_screen.dart (100%) rename lib/{ => modules/login}/login_screen.dart (78%) rename lib/{ => modules/messenger}/messenger_screen.dart (100%) rename lib/{ => modules/users}/users_screen.dart (94%) create mode 100644 lib/shared/components/components.dart create mode 100644 lib/shared/components/constants.dart create mode 100644 lib/shared/styles/colors.dart create mode 100644 lib/shared/styles/styles.dart diff --git a/lib/main.dart b/lib/main.dart index ae95b12..3f227e9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:udemy_flutter/bmi_screen.dart'; -import 'package:udemy_flutter/counter_screen.dart'; -import 'package:udemy_flutter/login_screen.dart'; -import 'package:udemy_flutter/messenger_screen.dart'; -import 'package:udemy_flutter/users_screen.dart'; +import 'package:udemy_flutter/modules/bmi/bmi_screen.dart'; +import 'package:udemy_flutter/modules/counter/counter_screen.dart'; +import 'package:udemy_flutter/modules/login/login_screen.dart'; +import 'package:udemy_flutter/modules/messenger/messenger_screen.dart'; +import 'package:udemy_flutter/modules/users/users_screen.dart'; void main() { @@ -25,7 +25,7 @@ class MyApp extends StatelessWidget { return MaterialApp( debugShowCheckedModeBanner: false, - home: BmiScreen(), + home: LoginScreen(), ); } } \ No newline at end of file diff --git a/lib/models/user/user_model.dart b/lib/models/user/user_model.dart new file mode 100644 index 0000000..4db7798 --- /dev/null +++ b/lib/models/user/user_model.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class UserModel { + final int id; + final String name; + final String phone; + + UserModel({ + @required this.id, + @required this.phone, + @required this.name, + }); +} \ No newline at end of file diff --git a/lib/bmi_screen.dart b/lib/modules/bmi/bmi_screen.dart similarity index 99% rename from lib/bmi_screen.dart rename to lib/modules/bmi/bmi_screen.dart index 0d56b9e..e61cd49 100644 --- a/lib/bmi_screen.dart +++ b/lib/modules/bmi/bmi_screen.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:udemy_flutter/bmi_result_screen.dart'; +import 'package:udemy_flutter/modules/bmi_result/bmi_result_screen.dart'; class BmiScreen extends StatefulWidget { @override diff --git a/lib/bmi_result_screen.dart b/lib/modules/bmi_result/bmi_result_screen.dart similarity index 100% rename from lib/bmi_result_screen.dart rename to lib/modules/bmi_result/bmi_result_screen.dart diff --git a/lib/counter_screen.dart b/lib/modules/counter/counter_screen.dart similarity index 100% rename from lib/counter_screen.dart rename to lib/modules/counter/counter_screen.dart diff --git a/lib/home_screen.dart b/lib/modules/home/home_screen.dart similarity index 100% rename from lib/home_screen.dart rename to lib/modules/home/home_screen.dart diff --git a/lib/login_screen.dart b/lib/modules/login/login_screen.dart similarity index 78% rename from lib/login_screen.dart rename to lib/modules/login/login_screen.dart index b702262..57d3860 100644 --- a/lib/login_screen.dart +++ b/lib/modules/login/login_screen.dart @@ -1,11 +1,21 @@ import 'package:flutter/material.dart'; +import 'package:udemy_flutter/shared/components/components.dart'; -class LoginScreen extends StatelessWidget { +// reusable components + +// 1. timing +// 2. refactor +// 3. quality +// 4. clean code + +class LoginScreen extends StatelessWidget +{ var emailController = TextEditingController(); var passwordController = TextEditingController(); @override - Widget build(BuildContext context) { + Widget build(BuildContext context) + { return Scaffold( appBar: AppBar(), body: Padding( @@ -69,21 +79,24 @@ class LoginScreen extends StatelessWidget { SizedBox( height: 20.0, ), - Container( - width: double.infinity, - color: Colors.blue, - child: MaterialButton( - onPressed: () { - print(emailController.text); - print(passwordController.text); - }, - child: Text( - 'LOGIN', - style: TextStyle( - color: Colors.white, - ), - ), - ), + defaultButton( + text: 'login', + function: () + { + print(emailController.text); + print(passwordController.text); + }, + ), + SizedBox( + height: 20.0, + ), + defaultButton( + text: 'ReGIster', + function: () + { + print(emailController.text); + print(passwordController.text); + }, ), SizedBox( height: 10.0, @@ -109,4 +122,4 @@ class LoginScreen extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/lib/messenger_screen.dart b/lib/modules/messenger/messenger_screen.dart similarity index 100% rename from lib/messenger_screen.dart rename to lib/modules/messenger/messenger_screen.dart diff --git a/lib/users_screen.dart b/lib/modules/users/users_screen.dart similarity index 94% rename from lib/users_screen.dart rename to lib/modules/users/users_screen.dart index 0ccc097..ec7ee9d 100644 --- a/lib/users_screen.dart +++ b/lib/modules/users/users_screen.dart @@ -1,16 +1,5 @@ import 'package:flutter/material.dart'; - -class UserModel { - final int id; - final String name; - final String phone; - - UserModel({ - @required this.id, - @required this.phone, - @required this.name, - }); -} +import 'package:udemy_flutter/models/user/user_model.dart'; class UsersScreen extends StatelessWidget { List users = [ diff --git a/lib/shared/components/components.dart b/lib/shared/components/components.dart new file mode 100644 index 0000000..53b0299 --- /dev/null +++ b/lib/shared/components/components.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +Widget defaultButton({ + double width = double.infinity, + Color background = Colors.blue, + bool isUpperCase = true, + double radius = 3.0, + @required Function function, + @required String text, +}) => + Container( + width: width, + height: 50.0, + child: MaterialButton( + onPressed: function, + child: Text( + isUpperCase ? text.toUpperCase() : text, + style: TextStyle( + color: Colors.white, + ), + ), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + radius, + ), + color: background, + ), + ); \ No newline at end of file diff --git a/lib/shared/components/constants.dart b/lib/shared/components/constants.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/shared/styles/colors.dart b/lib/shared/styles/colors.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/shared/styles/styles.dart b/lib/shared/styles/styles.dart new file mode 100644 index 0000000..e69de29 From 00929de823c64f9b125f4c4effa6347ca6414a9c Mon Sep 17 00:00:00 2001 From: abdullahmansss Date: Fri, 2 Apr 2021 02:45:26 +0200 Subject: [PATCH 7/8] form validation --- lib/modules/login/login_screen.dart | 182 +++++++++++++------------- lib/shared/components/components.dart | 31 ++++- 2 files changed, 122 insertions(+), 91 deletions(-) diff --git a/lib/modules/login/login_screen.dart b/lib/modules/login/login_screen.dart index 57d3860..f79809c 100644 --- a/lib/modules/login/login_screen.dart +++ b/lib/modules/login/login_screen.dart @@ -12,6 +12,7 @@ class LoginScreen extends StatelessWidget { var emailController = TextEditingController(); var passwordController = TextEditingController(); + var formKey = GlobalKey(); @override Widget build(BuildContext context) @@ -22,100 +23,101 @@ class LoginScreen extends StatelessWidget padding: const EdgeInsets.all(20.0), child: Center( child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Login', - style: TextStyle( - fontSize: 40.0, - fontWeight: FontWeight.bold, - ), - ), - SizedBox( - height: 40.0, - ), - TextFormField( - controller: emailController, - keyboardType: TextInputType.emailAddress, - onFieldSubmitted: (String value) { - print(value); - }, - onChanged: (String value) { - print(value); - }, - decoration: InputDecoration( - labelText: 'Email Address', - prefixIcon: Icon( - Icons.email, + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: + [ + Text( + 'Login', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, ), - border: OutlineInputBorder(), ), - ), - SizedBox( - height: 15.0, - ), - TextFormField( - controller: passwordController, - keyboardType: TextInputType.visiblePassword, - obscureText: true, - onFieldSubmitted: (String value) { - print(value); - }, - onChanged: (String value) { - print(value); - }, - decoration: InputDecoration( - labelText: 'Password', - prefixIcon: Icon( - Icons.lock, - ), - suffixIcon: Icon( - Icons.remove_red_eye, - ), - border: OutlineInputBorder(), + SizedBox( + height: 40.0, ), - ), - SizedBox( - height: 20.0, - ), - defaultButton( - text: 'login', - function: () - { - print(emailController.text); - print(passwordController.text); - }, - ), - SizedBox( - height: 20.0, - ), - defaultButton( - text: 'ReGIster', - function: () - { - print(emailController.text); - print(passwordController.text); - }, - ), - SizedBox( - height: 10.0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Don\'t have an account?', - ), - TextButton( - onPressed: () {}, - child: Text( - 'Register Now', + defaultFormField( + controller: emailController, + label: 'Email', + prefix: Icons.email, + type: TextInputType.emailAddress, + validate: (String value) + { + if(value.isEmpty) + { + return 'email must not be empty'; + } + + return null; + }, + ), + SizedBox( + height: 15.0, + ), + defaultFormField( + controller: passwordController, + label: 'Password', + prefix: Icons.lock, + suffix: Icons.remove_red_eye, + isPassword: true, + type: TextInputType.visiblePassword, + validate: (String value) + { + if(value.isEmpty) + { + return 'password is too short'; + } + + return null; + }, + ), + SizedBox( + height: 20.0, + ), + defaultButton( + text: 'login', + function: () + { + if(formKey.currentState.validate()) + { + print(emailController.text); + print(passwordController.text); + } + }, + ), + SizedBox( + height: 20.0, + ), + defaultButton( + text: 'ReGIster', + function: () + { + print(emailController.text); + print(passwordController.text); + }, + ), + SizedBox( + height: 10.0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Don\'t have an account?', ), - ), - ], - ), - ], + TextButton( + onPressed: () {}, + child: Text( + 'Register Now', + ), + ), + ], + ), + ], + ), ), ), ), diff --git a/lib/shared/components/components.dart b/lib/shared/components/components.dart index 53b0299..89aeae9 100644 --- a/lib/shared/components/components.dart +++ b/lib/shared/components/components.dart @@ -26,4 +26,33 @@ Widget defaultButton({ ), color: background, ), - ); \ No newline at end of file + ); + +Widget defaultFormField({ + @required TextEditingController controller, + @required TextInputType type, + Function onSubmit, + Function onChange, + bool isPassword = false, + @required Function validate, + @required String label, + @required IconData prefix, + IconData suffix, +}) => TextFormField( + controller: controller, + keyboardType: type, + obscureText: isPassword, + onFieldSubmitted: onSubmit, + onChanged: onChange, + validator: validate, + decoration: InputDecoration( + labelText: label, + prefixIcon: Icon( + prefix, + ), + suffixIcon: suffix != null ? Icon( + suffix, + ) : null, + border: OutlineInputBorder(), + ), +); \ No newline at end of file From 43220305a2e1ea8872df99e88d4411117b6ff5d4 Mon Sep 17 00:00:00 2001 From: Anas Banat <48512137+Anas-Banat@users.noreply.github.com> Date: Thu, 29 Dec 2022 02:05:07 +0300 Subject: [PATCH 8/8] Update components.dart replaced Function with VoidCallback and removed '@' from required parameters. --- lib/shared/components/components.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/shared/components/components.dart b/lib/shared/components/components.dart index 89aeae9..e486971 100644 --- a/lib/shared/components/components.dart +++ b/lib/shared/components/components.dart @@ -5,8 +5,8 @@ Widget defaultButton({ Color background = Colors.blue, bool isUpperCase = true, double radius = 3.0, - @required Function function, - @required String text, + required VoidCallback function, + required String text, }) => Container( width: width, @@ -55,4 +55,4 @@ Widget defaultFormField({ ) : null, border: OutlineInputBorder(), ), -); \ No newline at end of file +);