import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:firebase_auth/firebase_auth.dart'; class LoginPage extends StatefulWidget { const LoginPage({ Key? key, }) : super(key: key); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final GlobalKey _formKey = GlobalKey(); final FocusNode _focusNodePassword = FocusNode(); final TextEditingController _controllerUsername = TextEditingController(); final TextEditingController _controllerPassword = TextEditingController(); bool _obscurePassword = true; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey[300], body: Form( key: _formKey, child: SingleChildScrollView( padding: const EdgeInsets.all(30.0), child: Column( children: [ Image.asset( "assets/logo.png", height: 190, ), Text( "Welcome back", style: Theme.of(context).textTheme.headlineMedium, ), Text( "Login to your account", style: Theme.of(context).textTheme.bodySmall, ), const SizedBox(height: 40), TextFormField( controller: _controllerUsername, keyboardType: TextInputType.name, decoration: InputDecoration( labelText: "Email", prefixIcon: const Icon(Icons.email_outlined), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), onEditingComplete: () => _focusNodePassword.requestFocus(), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter username."; } return null; }, ), const SizedBox(height: 10), TextFormField( controller: _controllerPassword, focusNode: _focusNodePassword, obscureText: _obscurePassword, keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( labelText: "Password", prefixIcon: const Icon(Icons.password_outlined), suffixIcon: IconButton( onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, icon: _obscurePassword ? const Icon(Icons.visibility_outlined) : const Icon(Icons.visibility_off_outlined)), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter password."; } return null; }, ), const SizedBox(height: 60), Column( children: [ ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size.fromHeight(50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), backgroundColor: Color(0xFF355291), ), onPressed: () async { if (_formKey.currentState?.validate() ?? false) { try { await FirebaseAuth.instance .signInWithEmailAndPassword( email: _controllerUsername.text.trim(), password: _controllerPassword.text.trim()) .then((value) => Navigator.pushNamedAndRemoveUntil( context, '/', (route) => false)); } on FirebaseAuthException catch (e) { Fluttertoast.showToast( msg: e.message.toString(), gravity: ToastGravity.SNACKBAR); } } }, child: const Text("Login"), ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text("Don't have an account?"), TextButton( onPressed: () { _formKey.currentState?.reset(); Navigator.pushNamedAndRemoveUntil( context, "/signup", (route) => false); }, child: const Text("Signup"), ), ], ), ], ), ], ), ), ), ); } @override void dispose() { _focusNodePassword.dispose(); _controllerUsername.dispose(); _controllerPassword.dispose(); super.dispose(); } }