From 122ca8c5cf1058ccfdf7a9b90ec2c841ba05c8d3 Mon Sep 17 00:00:00 2001 From: sma Date: Mon, 19 Feb 2024 17:06:58 +0630 Subject: [PATCH] validate form in pinloginpage --- lib/pages/signin/pinlogin_page.dart | 139 ++++++++++++++++++---------- 1 file changed, 92 insertions(+), 47 deletions(-) diff --git a/lib/pages/signin/pinlogin_page.dart b/lib/pages/signin/pinlogin_page.dart index de5be55..9dd33b2 100644 --- a/lib/pages/signin/pinlogin_page.dart +++ b/lib/pages/signin/pinlogin_page.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:pin_input_text_field/pin_input_text_field.dart'; class PinLoginPage extends StatefulWidget { - //final User user; + //final User user; const PinLoginPage({super.key}); @override @@ -16,8 +16,9 @@ class PinLoginPage extends StatefulWidget { class _PinLoginPageState extends State { bool _isLoading = false; - late String pin; - //late User _user; + String pin = ""; + //late User _user; + final _formKey = GlobalKey(); TextEditingController _fcsIdCtl = new TextEditingController(); @override @@ -34,6 +35,13 @@ class _PinLoginPageState extends State { final fcsIdBox = TextFormField( controller: _fcsIdCtl, autofocus: true, + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter FCS ID'; + } + return null; + }, style: TextStyle( fontSize: 15, color: Colors.black87, fontWeight: FontWeight.w500), cursorColor: primaryColor, @@ -47,6 +55,7 @@ class _PinLoginPageState extends State { borderSide: BorderSide(color: primaryColor, width: 1.0)), disabledBorder: UnderlineInputBorder( borderSide: BorderSide(color: primaryColor, width: 1.0)), + errorStyle: TextStyle(color: dangerColor), ), ); @@ -60,6 +69,46 @@ class _PinLoginPageState extends State { fit: BoxFit.fitHeight, ), ); + final pinInputBox = FormField( + validator: (value) { + if (pin == "") { + return "Please enter PIN"; + } + if (pin.length < 6) { + return "PIN must be 6 digit"; + } + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + builder: (state) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PinInputTextField( + cursor: Cursor( + color: primaryColor, enabled: true, width: 2, height: 23), + pinLength: 6, + decoration: BoxLooseDecoration( + strokeColorBuilder: PinListenColorBuilder( + primaryColor, Colors.grey.shade400), + errorTextStyle: TextStyle(color: dangerColor)), + textInputAction: TextInputAction.done, + autoFocus: false, + onChanged: _pinChange, + ), + Padding( + padding: const EdgeInsets.only(top: 8), + child: pin == "" || pin.length < 6 + ? SizedBox( + height: 20, + child: Text(state.errorText ?? "", + style: TextStyle(color: dangerColor, fontSize: 12)), + ) + : const SizedBox(height: 20), + ) + ], + ); + }); final loginBtn = Padding( padding: EdgeInsets.only(top: 30), @@ -73,49 +122,41 @@ class _PinLoginPageState extends State { child: new Scaffold( // appBar: LocalAppBar( // backgroundColor: primaryColor, - - + // ), - body: ListView( - padding: EdgeInsets.only(top: 80, left: 15, right: 15, bottom: 20), - children: [ - pinLoginLogo, - Padding( - padding: EdgeInsets.only(top: 20, bottom: 20), - child: Center( - child: LocalText(context, "welcome.pinlogin", - color: Colors.black, fontSize: 18), - ), + body: Form( + key: _formKey, + child: ListView( + padding: EdgeInsets.only(top: 80, left: 15, right: 15, bottom: 20), + children: [ + pinLoginLogo, + Padding( + padding: EdgeInsets.only(top: 20, bottom: 20), + child: Center( + child: LocalText(context, "welcome.pinlogin", + color: Colors.black, fontSize: 18), ), - LocalText( - context, - "welcome.pinlogin.fcsid", - color: Colors.black54, - fontSize: 15, - ), - fcsIdBox, - Padding( - padding: EdgeInsets.only(top: 25, bottom: 20), - child: LocalText( - context, - "welcome.pinlogin.pin", - color: Colors.black54, - fontSize: 15, - )), - PinInputTextField( - cursor: Cursor( - color: primaryColor, enabled: true, width: 2, height: 23), - pinLength: 6, - decoration: BoxLooseDecoration( - strokeColorBuilder: PinListenColorBuilder( - primaryColor, Colors.grey.shade400)), - textInputAction: TextInputAction.done, - autoFocus: false, - onChanged: _pinChange, - ), - loginBtn, - ], - )), + ), + LocalText( + context, + "welcome.pinlogin.fcsid", + color: Colors.black54, + fontSize: 15, + ), + fcsIdBox, + Padding( + padding: EdgeInsets.only(top: 25, bottom: 20), + child: LocalText( + context, + "welcome.pinlogin.pin", + color: Colors.black54, + fontSize: 15, + )), + pinInputBox, + loginBtn, + ], + ), + )), ); } @@ -124,17 +165,21 @@ class _PinLoginPageState extends State { this.pin = pin; }); } + _login() async { - if (pin == "") { + if (pin == "" && _formKey.currentState!.validate()) { showMsgDialog(context, "Error", "Invalid PIN"); return; } - if (pin.length < 6) { + if (pin.length < 6 && _formKey.currentState!.validate()) { showMsgDialog(context, "Error", "PIN must be 6 digits"); return; } - + if (!_formKey.currentState!.validate()) { + return; + } + setState(() { _isLoading = true; });