From 2c34b2964d53bd3ccddc73c4414a4246e16b00a9 Mon Sep 17 00:00:00 2001 From: vincemarcus Date: Sat, 30 Apr 2022 13:16:32 +0700 Subject: [PATCH] Add LoginScreen and change HomeScreen to WelcomeScreen. --- assets/icons/facebook-icon.png | Bin 0 -> 3489 bytes assets/icons/google-icon.png | Bin 0 -> 22726 bytes lib/views/app.dart | 10 +- lib/views/home_screen.dart | 18 ---- .../login_screen/components/app_bar.dart | 33 +++++++ .../components/bottom_buttons.dart | 75 --------------- .../components/facebook_button.dart | 51 +++++++++++ .../components/forgot_password.dart | 13 +++ .../components/google_button.dart | 43 +++++++++ .../login_screen/components/input_field.dart | 75 +++++++++++++++ .../login_screen/components/login_button.dart | 41 +++++++++ .../login_screen/components/policy_text.dart | 27 ++++++ lib/views/login_screen/login_screen.dart | 55 +++++++++-- .../components/bottom_buttons.dart | 86 ++++++++++++++++++ .../components/center_display.dart | 2 +- lib/views/welcome_screen/welcome_screen.dart | 27 ++++++ pubspec.yaml | 1 + test/widget_test.dart | 58 ++++++------ 18 files changed, 482 insertions(+), 133 deletions(-) create mode 100644 assets/icons/facebook-icon.png create mode 100644 assets/icons/google-icon.png delete mode 100644 lib/views/home_screen.dart create mode 100644 lib/views/login_screen/components/app_bar.dart delete mode 100644 lib/views/login_screen/components/bottom_buttons.dart create mode 100644 lib/views/login_screen/components/facebook_button.dart create mode 100644 lib/views/login_screen/components/forgot_password.dart create mode 100644 lib/views/login_screen/components/google_button.dart create mode 100644 lib/views/login_screen/components/input_field.dart create mode 100644 lib/views/login_screen/components/login_button.dart create mode 100644 lib/views/login_screen/components/policy_text.dart create mode 100644 lib/views/welcome_screen/components/bottom_buttons.dart rename lib/views/{login_screen => welcome_screen}/components/center_display.dart (91%) create mode 100644 lib/views/welcome_screen/welcome_screen.dart diff --git a/assets/icons/facebook-icon.png b/assets/icons/facebook-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ca05f181a708395896f672a6aed22db719028026 GIT binary patch literal 3489 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 literal 0 HcmV?d00001 diff --git a/lib/views/app.dart b/lib/views/app.dart index 19a864a..bc9051a 100644 --- a/lib/views/app.dart +++ b/lib/views/app.dart @@ -1,4 +1,5 @@ import 'package:duolingo/views/login_screen/login_screen.dart'; +import 'package:duolingo/views/welcome_screen/welcome_screen.dart'; import 'package:flutter/material.dart'; class MyDuolingo extends StatelessWidget { @@ -6,10 +7,15 @@ class MyDuolingo extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( + return MaterialApp( + routes: { + '/': (context) => const WelcomeScreen(), + // When navigating to the "/second" route, build the SecondScreen widget. + '/login': (context) => const LoginScreen(), + }, debugShowCheckedModeBanner: false, title: 'Duolingo', - home: LoginScreen(), + // home: const WelcomeScreen(), ); } } \ No newline at end of file diff --git a/lib/views/home_screen.dart b/lib/views/home_screen.dart deleted file mode 100644 index f02807a..0000000 --- a/lib/views/home_screen.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/material.dart'; - -class HomeScreen extends StatefulWidget { - const HomeScreen({Key? key}) : super(key: key); - - @override - State createState() { - return HomeScreenState(); - } -} - -class HomeScreenState extends State{ - @override - Widget build(BuildContext context) { - // TODO: implement build - throw UnimplementedError(); - } -} \ No newline at end of file diff --git a/lib/views/login_screen/components/app_bar.dart b/lib/views/login_screen/components/app_bar.dart new file mode 100644 index 0000000..fb1eb64 --- /dev/null +++ b/lib/views/login_screen/components/app_bar.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class LoginAppBar extends StatelessWidget implements PreferredSizeWidget { + const LoginAppBar({Key? key}) : super(key: key); + + @override + // TODO: implement preferredSize + Size get preferredSize => const Size.fromHeight(100); + + @override + Widget build(BuildContext context) { + return AppBar( + shadowColor: Colors.transparent, + backgroundColor: Colors.transparent, + title: Text( + 'Enter your details', + style: + TextStyle(color: Colors.grey.shade600, fontWeight: FontWeight.bold), + ), + centerTitle: true, + leading: IconButton( + icon: Icon( + Icons.close, + color: Colors.grey.shade600, + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ); + } + +} \ No newline at end of file diff --git a/lib/views/login_screen/components/bottom_buttons.dart b/lib/views/login_screen/components/bottom_buttons.dart deleted file mode 100644 index 35749f9..0000000 --- a/lib/views/login_screen/components/bottom_buttons.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/material.dart'; - -class BottomButtons extends StatefulWidget { - const BottomButtons({Key? key}) : super(key: key); - - @override - State createState() { - return BottomButtonsState(); - } -} - -class BottomButtonsState extends State { - @override - Widget build(BuildContext context) { - return Center( - child: Align( - alignment: Alignment.bottomCenter, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: double.infinity, - height: 50, - margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), - padding: const EdgeInsets.only(bottom: 2), - child: ElevatedButton( - onPressed: () {}, - child: const Text( - 'CHOOSE A LANGUAGE', - style: TextStyle( - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - style: ElevatedButton.styleFrom( - primary: const Color(0xFF7ac70c), - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - ), - ), - ), - Container( - width: double.infinity, - height: 50, - margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(width: 3, color: const Color(0xFF7ac70c)), - ), - child: ElevatedButton( - onPressed: () {}, - child: const Text( - 'I ALREADY HAVE AN ACCOUNT', - style: TextStyle( - color: Colors.green, - fontSize: 18, - fontWeight: FontWeight.bold), - ), - style: ElevatedButton.styleFrom( - primary: Colors.white, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12)), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/views/login_screen/components/facebook_button.dart b/lib/views/login_screen/components/facebook_button.dart new file mode 100644 index 0000000..54e67c0 --- /dev/null +++ b/lib/views/login_screen/components/facebook_button.dart @@ -0,0 +1,51 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class FacebookButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Expanded( + flex: 1, + child: Container( + width: double.infinity, + height: 50, + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(12)), + border: Border.all(width: 3, color: Colors.grey.shade400), + ), + child: ElevatedButton( + onPressed: () { + Navigator.pushNamed(context, '/login'); + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) => const LoginScreen()), + // ); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/icons/facebook-icon.png', + height: 25, + ), + Text( + ' FACEBOOK', + style: TextStyle( + color: Colors.indigo.shade900, + fontSize: 16, + fontWeight: FontWeight.bold), + ), + ], + ), + style: ElevatedButton.styleFrom( + primary: Colors.white, + elevation: 5, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + ), + ); + } +} diff --git a/lib/views/login_screen/components/forgot_password.dart b/lib/views/login_screen/components/forgot_password.dart new file mode 100644 index 0000000..83b79d5 --- /dev/null +++ b/lib/views/login_screen/components/forgot_password.dart @@ -0,0 +1,13 @@ +import 'package:flutter/cupertino.dart'; + +class ForgotPassword extends StatelessWidget { + @override + Widget build(BuildContext context) { + return const Text( + 'FORGOT PASSWORD', + style: TextStyle( + fontSize: 17, fontWeight: FontWeight.bold, color: Color(0xFF1CB0F6)), + ); + } + +} \ No newline at end of file diff --git a/lib/views/login_screen/components/google_button.dart b/lib/views/login_screen/components/google_button.dart new file mode 100644 index 0000000..37da74b --- /dev/null +++ b/lib/views/login_screen/components/google_button.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class GoogleButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Expanded( + flex: 1, + child: Container( + width: double.infinity, + height: 50, + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(12)), + border: Border.all(width: 3, color: Colors.grey.shade400)), + child: ElevatedButton( + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/icons/google-icon.png', + height: 20, + ), + Text( + ' GOOGLE', + style: TextStyle( + color: Colors.grey.shade900, + fontSize: 16, + fontWeight: FontWeight.bold), + ), + ], + ), + style: ElevatedButton.styleFrom( + primary: Colors.white, + elevation: 5, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + ), + ); + } +} diff --git a/lib/views/login_screen/components/input_field.dart b/lib/views/login_screen/components/input_field.dart new file mode 100644 index 0000000..3e00ab2 --- /dev/null +++ b/lib/views/login_screen/components/input_field.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; + +class InputField extends StatefulWidget { + @override + State createState() { + return InputFieldState(); + } +} + +class InputFieldState extends State { + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + bool isObscure = true; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + child: Column( + children: [ + accountField(), + passwordField(), + ], + ), + ); + } + + accountField() { + return TextFormField( + controller: emailController, + keyboardType: TextInputType.emailAddress, + decoration: const InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.only( + topRight: Radius.circular(15.0), + topLeft: Radius.circular(15.0), + ), + ), + hintText: 'Username or email', + // errorText: snapshot.hasError ? snapshot.error as String : null + ), + // validator: validateEmail, + onChanged: (value) { + // bloc.changeEmail(value); + }, + ); + } + + passwordField() { + return TextFormField( + controller: passwordController, + obscureText: isObscure, + decoration: InputDecoration( + suffixIcon: IconButton( + icon: Icon( + isObscure ? Icons.visibility : Icons.visibility_off, + color: const Color(0xFF1CB0F6), + ), + onPressed: () { + isObscure = !isObscure; + setState(() {}); + }, + ), + border: const OutlineInputBorder( + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(15.0), + bottomLeft: Radius.circular(15.0), + ), + ), + hintText: 'Password', + ), + // validator: validatePassword, + ); + } +} \ No newline at end of file diff --git a/lib/views/login_screen/components/login_button.dart b/lib/views/login_screen/components/login_button.dart new file mode 100644 index 0000000..a21650d --- /dev/null +++ b/lib/views/login_screen/components/login_button.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class LoginButton extends StatefulWidget { + const LoginButton({Key? key}) : super(key: key); + + @override + State createState() { + return LoginButtonState(); + } + +} + +class LoginButtonState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + height: 50, + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + padding: const EdgeInsets.only(bottom: 2), + child: ElevatedButton( + onPressed: () {}, + child: const Text( + 'SIGN IN', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + style: ElevatedButton.styleFrom( + primary: const Color(0xFF1CB0F6), + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + ), + ); + } +} diff --git a/lib/views/login_screen/components/policy_text.dart b/lib/views/login_screen/components/policy_text.dart new file mode 100644 index 0000000..fde1f02 --- /dev/null +++ b/lib/views/login_screen/components/policy_text.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class PolicyText extends StatelessWidget { + @override + Widget build(BuildContext context) { + return RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle( + fontSize: 14.0, + height: 1.5, + color: Colors.grey.shade600, + ), + children: const [ + TextSpan(text: 'By signing in to Duolingo, you agree to our '), + TextSpan( + text: 'Terms', style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan(text: ' and '), + TextSpan( + text: '\nPrivacy Policy', + style: TextStyle(fontWeight: FontWeight.bold)), + ], + ), + ); + } +} diff --git a/lib/views/login_screen/login_screen.dart b/lib/views/login_screen/login_screen.dart index 067a954..1d65e87 100644 --- a/lib/views/login_screen/login_screen.dart +++ b/lib/views/login_screen/login_screen.dart @@ -1,9 +1,13 @@ import 'dart:ui'; +import 'package:duolingo/views/login_screen/components/facebook_button.dart'; +import 'package:duolingo/views/login_screen/components/forgot_password.dart'; +import 'package:duolingo/views/login_screen/components/google_button.dart'; +import 'package:duolingo/views/login_screen/components/login_button.dart'; +import 'package:duolingo/views/login_screen/components/policy_text.dart'; import 'package:flutter/material.dart'; - -import 'components/bottom_buttons.dart'; -import 'components/center_display.dart'; +import 'components/app_bar.dart'; +import 'components/input_field.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({Key? key}) : super(key: key); @@ -15,15 +19,50 @@ class LoginScreen extends StatefulWidget { } class LoginScreenState extends State { + final formKey = GlobalKey(); + @override Widget build(BuildContext context) { return Scaffold( - body: Column( - children: const [ - Expanded(child: CenterDisplay()), - BottomButtons(), - ], + appBar: const LoginAppBar(), + body: Container( + margin: const EdgeInsets.only(bottom: 10), + child: Column( + children: [ + Form( + key: formKey, + child: InputField(), + ), + Container(margin: const EdgeInsets.only(top: 10)), + const LoginButton(), + Container(margin: const EdgeInsets.only(top: 10)), + ForgotPassword(), + bottomDisplay(), + ], + ), ), ); } + + bottomDisplay() { + return Expanded( + child: Align( + alignment: FractionalOffset.bottomCenter, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + // mainAxisSize: MainAxisSize.max, + children: [ + FacebookButton(), + GoogleButton(), + ], + ), + PolicyText(), + ], + ), + ), + ); + } + } diff --git a/lib/views/welcome_screen/components/bottom_buttons.dart b/lib/views/welcome_screen/components/bottom_buttons.dart new file mode 100644 index 0000000..9afc940 --- /dev/null +++ b/lib/views/welcome_screen/components/bottom_buttons.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +class BottomButtons extends StatelessWidget { + const BottomButtons({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Align( + alignment: Alignment.bottomCenter, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + chooseLanguageButton(), + logInButton(context), + ], + ), + ), + ); + } + + logInButton(BuildContext context) { + return Container( + width: double.infinity, + height: 50, + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(12)), + border: Border.all(width: 3, color: const Color(0xFF7ac70c)), + ), + child: ElevatedButton( + onPressed: () { + Navigator.pushNamed(context, '/login'); + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) => const LoginScreen()), + // ); + }, + child: const Text( + 'I ALREADY HAVE AN ACCOUNT', + style: TextStyle( + color: Colors.green, fontSize: 18, fontWeight: FontWeight.bold), + ), + style: ElevatedButton.styleFrom( + primary: Colors.white, + elevation: 5, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + ); + } + + chooseLanguageButton() { + return Container( + width: double.infinity, + height: 50, + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + padding: const EdgeInsets.only(bottom: 2), + child: ElevatedButton( + onPressed: () {}, + child: const Text( + 'CHOOSE A LANGUAGE', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + style: ElevatedButton.styleFrom( + primary: const Color(0xFF7ac70c), + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + ), + ); + } +} +// +// class BottomButtonsState extends State { +// @override +// Widget build(BuildContext context) { +// return +// } diff --git a/lib/views/login_screen/components/center_display.dart b/lib/views/welcome_screen/components/center_display.dart similarity index 91% rename from lib/views/login_screen/components/center_display.dart rename to lib/views/welcome_screen/components/center_display.dart index bfbe7a0..2dfa853 100644 --- a/lib/views/login_screen/components/center_display.dart +++ b/lib/views/welcome_screen/components/center_display.dart @@ -9,7 +9,7 @@ class CenterDisplay extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Image.asset('assets/images/duo-wave.png', width: 200, height: 170), + Image.asset('assets/images/duo-wave.png', height: 150), Container(padding: const EdgeInsets.all(5)), Image.asset('assets/images/duolingo-logo.png', width: 125, height: 40), diff --git a/lib/views/welcome_screen/welcome_screen.dart b/lib/views/welcome_screen/welcome_screen.dart new file mode 100644 index 0000000..6f17036 --- /dev/null +++ b/lib/views/welcome_screen/welcome_screen.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +import 'components/bottom_buttons.dart'; +import 'components/center_display.dart'; + +class WelcomeScreen extends StatefulWidget { + const WelcomeScreen({Key? key}) : super(key: key); + + @override + State createState() { + return WelcomeScreenState(); + } +} + +class WelcomeScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: const [ + Expanded(child: CenterDisplay()), + BottomButtons(), + ], + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index bbaefaf..d4a0a97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,6 +60,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/images/ + - assets/icons/ # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg diff --git a/test/widget_test.dart b/test/widget_test.dart index 1f71619..c2f8382 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,30 +1,30 @@ -// This is a basic Flutter widget test. +// // This is a basic Flutter widget test. +// // +// // To perform an interaction with a widget in your test, use the WidgetTester +// // utility that Flutter provides. For example, you can send tap and scroll +// // gestures. You can also use WidgetTester to find child widgets in the widget +// // tree, read text, and verify that the values of widget properties are correct. // -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:duolingo/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +// import 'package:flutter/material.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// +// import 'package:duolingo/main.dart'; +// +// void main() { +// testWidgets('Counter increments smoke test', (WidgetTester tester) async { +// // Build our app and trigger a frame. +// await tester.pumpWidget(const MyApp()); +// +// // Verify that our counter starts at 0. +// expect(find.text('0'), findsOneWidget); +// expect(find.text('1'), findsNothing); +// +// // Tap the '+' icon and trigger a frame. +// await tester.tap(find.byIcon(Icons.add)); +// await tester.pump(); +// +// // Verify that our counter has incremented. +// expect(find.text('0'), findsNothing); +// expect(find.text('1'), findsOneWidget); +// }); +// }