Selamat Pagi. Semoga kita selalu dilindungi dari segala mara bahaya, Aaminn 🙏😊
Setelah kemarin kita mempelajari tentang pembuatan IntroSlider, kali ini kita mempelajari pembuatan Form Login validation pada Flutter.
Karena ini terdapat validation pada inputan maka kita menggunakan StatefulWidget. dan kita menggunakan Global Key . apa itu Global key ? Global key adalah Key yang digunakan untuk menyimpan state dari suatu Widget agar tidak hilang saat melakukan aktivitas lain atau berpindah ke Widget lain.
Berikut struktur dari dari Global key yang di berikan kepada Form:
final formKey = GlobalKey<FormState>();
Setelah itu, kita menuliskan widget apa saja yang diperlukan untuk membuat tampilan login :
- Widget Title : Widget ini berfungsi untuk memberi judul pada Form Login . Pada pembuatan form login kali ini kita beri judul "First Flutter" dengan fontSize 24 dan type font AverinBold.
Widget labelTitle() {
return Text(
"First Flutter",
style: TextStyle(fontFamily: "AvenirBold", fontSize: 24,),
);
}
return Text(
"First Flutter",
style: TextStyle(fontFamily: "AvenirBold", fontSize: 24,),
);
}
- Widget Email : Widget ini nantinya berfungsi untuk memasukkan email sebagai media untuk masuk ke halaman utama aplikasi. Dimana dalam inputan ini kita memberi validation inputan harus menggandung "@" , keyboard inputan berupa Keyboard email, jika sudah selesai maka dapat diteruskan ke inputan selanjutnya, serta di simpan di variabel _email.
Widget _entryFieldEmail(BuildContext context, String title) {
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
TextFormField(
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
validator: (val) =>
!val.contains('@') ? 'Not a valid Email.' : null,
onSaved: (val) => _email = val,
decoration: InputDecoration(
border: InputBorder.none,
fillColor: Colors.white,
filled: true),
)
],
),
);
}
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
TextFormField(
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
validator: (val) =>
!val.contains('@') ? 'Not a valid Email.' : null,
onSaved: (val) => _email = val,
decoration: InputDecoration(
border: InputBorder.none,
fillColor: Colors.white,
filled: true),
)
],
),
);
}
- Widget Password : Widget selanjutnya adalah inputan password, sebagaimana standart dari setiap login pasti menggunakan password sebagai salah satu security untuk bisa masuk ke dalam aplikasi. pada kali validation dari inputan yang dimasukkan adalah panjang password minimal 6 digit , inpuan yang dimasukkan security dan tidak dapat dilihat.
Widget _entryFieldPassword(BuildContext context, String title) {
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
TextFormField(
keyboardType: TextInputType.text,
textInputAction: TextInputAction.done,
validator: (val) => val.length < 6 ? 'Password too Short.' : null,
onSaved: (val) => _password = val,
obscureText: true,
decoration: InputDecoration(
border: InputBorder.none,
fillColor: Colors.white,
filled: true),
)
],
),
);
}
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
TextFormField(
keyboardType: TextInputType.text,
textInputAction: TextInputAction.done,
validator: (val) => val.length < 6 ? 'Password too Short.' : null,
onSaved: (val) => _password = val,
obscureText: true,
decoration: InputDecoration(
border: InputBorder.none,
fillColor: Colors.white,
filled: true),
)
],
),
);
}
- Widget Submit login : Widget ini berfungsi sebagai action untuk berpindah dari dari state ke state yang lain. pada kali ini kita menggunakan InkWell , berikut struktu sederhana dari InkWell
InkWell(
onTap: () {
//action when widget onTap
},
child: Container(
//content UI
),
);
onTap: () {
//action when widget onTap
},
child: Container(
//content UI
),
);
Untuk content UI nya kita menggunakan Container agar mudah untuk didesain, seperti pada kali ini kita memanfaatkan BoxDecoration untuk memberikan borderRadius, boxShadow dan gradien serta menambakan child untuk memberikan Text "Login".
child: Container(
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.symmetric(vertical: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(5)),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.grey.shade200,
offset: Offset(2, 4),
blurRadius: 5,
spreadRadius: 2)
],
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Colors.greenAccent, Colors.green])),
child: Text(
'Login',
style: TextStyle(fontSize: 20, color: Colors.white),
),
),
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.symmetric(vertical: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(5)),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.grey.shade200,
offset: Offset(2, 4),
blurRadius: 5,
spreadRadius: 2)
],
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Colors.greenAccent, Colors.green])),
child: Text(
'Login',
style: TextStyle(fontSize: 20, color: Colors.white),
),
),
Sedangkan untuk actionya kita buat void sendiri , seperti berikut :
void _login() {
final form = formKey.currentState;
if (form.validate()) {
form.save();
}
var requestLogin = {"email": _email, "password": _password};
var api = ApiService.login(requestLogin);
api.then((response) {
final Map parsed = json.decode(response);
userlogin login = userlogin();
login.Username = parsed['data']['Username'];
login.email = parsed['data']['email'];
apiSession.save('login', login);
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => HomePage()));
print("success");
}, onError: (error) {
print(error.toString());
});
}
final form = formKey.currentState;
if (form.validate()) {
form.save();
}
var requestLogin = {"email": _email, "password": _password};
var api = ApiService.login(requestLogin);
api.then((response) {
final Map parsed = json.decode(response);
userlogin login = userlogin();
login.Username = parsed['data']['Username'];
login.email = parsed['data']['email'];
apiSession.save('login', login);
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => HomePage()));
print("success");
}, onError: (error) {
print(error.toString());
});
}
- Widget Forget Password : Widget ini membantu user ketikan lupa dengan password miliknya , natinya widget ini berguna untuk mengarahkan user ke tampilan Lupa password.
Widget _forgetPassword() {
return Container(
padding: EdgeInsets.symmetric(vertical: 10),
alignment: Alignment.centerRight,
child: InkWell(
onTap: () {
print(" go to forget password page);
},
child: Text(
"Forgot Password ?",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
),
),
);
}
return Container(
padding: EdgeInsets.symmetric(vertical: 10),
alignment: Alignment.centerRight,
child: InkWell(
onTap: () {
print(" go to forget password page);
},
child: Text(
"Forgot Password ?",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
),
),
);
}
- Widget Register : Widget ini adalah Widget yang mengarahkan user ke halaman halaman Register.
Widget labelRegister() {
return InkWell(
onTap: () {
print(" go to Register page");
},
child: Text(
"Dont have Account, Please Register.",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
);
}
return InkWell(
onTap: () {
print(" go to Register page");
},
child: Text(
"Dont have Account, Please Register.",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
);
}
Berikut Tampilan yang dihasilkan dari code diatas :
Berikut link Github dari percobaan kali ini, semoga bermanfaat 😋:
Pembuatan Form Login beserta Validation pada Flutter
Reviewed by sdiik
on
March 22, 2020
Rating:
No comments: