Home Android Build a Registration Form with Validation

Build a Registration Form with Validation

0
Build a Registration Form with Validation

Halo sobat Flutter! Pada artikel kali ini saya ingin membahas tentang “Build a Registration Form with Validation”.

Ketika melakukan registrasi, sering kali aplikasi tersebut membutuhkan sebuah informasi dari penggunanya. Misalnya seperti memasukkan data pribadi. Data Pribadi yang dimaksud bisa berupa nama, email, no telp, dan password.

Namun untuk mengetahui data yang diinput benar atau salahnya maka dibutuhkan sebuah validasi dalam Registrasi tersebut. Nantinya jika data yang dimasukkan benar maka akan terinput benar dalam sebuah alert dialog, Namun jika data yang diinputkan salah atau kurang maka akan muncul pesan dalam form registrasi tersebut.

Yuk simak bagaimana melakukan validasi tersebut.

  1. Buat sebuah frontend untuk tampilan Registrasi.
    disini yang dibutuhkan yaitu :
    – Nama Lengkap
    – Email Pribadi
    – No Telp
    – Alamat
    – Agama
    – Jenis Kelamin
    – Password
import 'package:flutter/material.dart';

class RegisterForm extends StatefulWidget {
  const RegisterForm({Key? key}) : super(key: key);

  @override
  _RegisterFormState createState() => _RegisterFormState();
}

class _RegisterFormState extends State<RegisterForm> {
  TextEditingController fullname = TextEditingController();
  TextEditingController email = TextEditingController();
  TextEditingController telp = TextEditingController();
  TextEditingController alamat = TextEditingController();
  TextEditingController pass = TextEditingController();
 
  String? agama;
  String? gender;

//Radio List Tile untuk gender
  void pilihGender(String? value) {
    setState(() {
      // untuk refresh value
      gender = value;
    });
  }

//dropdownbutton agama
  List<String> listAgama = [
    'Islam',
    'Kristen Protestan',
    'Kristen Katolok',
    'Budha',
    'Hindu',
    'Konghucu'
  ];

  void pilihAgama(String? value) {
    // method untuk fungsi
    setState(() {
      agama = value;
    });
  }

//cara visibility
  bool hiden = true;
  void visible() {
    setState(() {
      hiden = !hiden;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.amber,
        title: Text("Register Form"),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(10.0),


            child: Column(
              children: [
                TextFormField(
                  controller: fullname,
                  decoration: InputDecoration(
                    hintText: 'FullName',
                    prefixIcon: Icon(Icons.person),
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10)),
                  ),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  controller: email,
                  keyboardType: TextInputType.emailAddress,
                  decoration: InputDecoration(
                    hintText: 'Email',
                    prefixIcon: Icon(Icons.email),
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10)),
                  ),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  controller: telp,
                  keyboardType: TextInputType.number,
                  decoration: InputDecoration(
                      prefixIcon: Icon(Icons.person),
                      hintText: 'No Telp',
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  controller: alamat,
                  keyboardType: TextInputType.text,
                  maxLines: 2,
                  decoration: InputDecoration(
                      // prefixIcon: Icon(Icons.place),
                      hintText: 'Alamat',
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(height: 8),

                //tambah agama dropdownbutton
                Container(
                  padding: EdgeInsets.symmetric(horizontal: 8),
                  decoration: BoxDecoration(
                    border: Border.all(
                        width: 1, color: Colors.grey.withOpacity(0.5)),
                    borderRadius: BorderRadius.circular(10),
                  ),
                  child: DropdownButtonHideUnderline(
                    child: DropdownButton(
                      isExpanded: true,
                      value: agama,
                      hint: Padding(
                        padding: const EdgeInsets.all(10.0),
                        child: Text('Pilih Agama'),
                      ),
                      items: listAgama.map((e) {
                        return DropdownMenuItem(
                          child: Text(e),
                          value: e,
                        );
                      }).toList(),
                      onChanged: (String? value) {
                        setState(() {
                          pilihAgama(value);
                        });
                      },
                    ),
                  ),
                ),

                SizedBox(height: 8),

                //tambah gender
                Container(
                    child: Row(
                  children: [
                    Flexible(
                      child: RadioListTile(
                        value: "Laki Laki",
                        groupValue: gender,
                        onChanged: (String? value) {
                          setState(
                            () {
                              pilihGender(value);
                            },
                          );
                        },
                        title: Text("Laki Laki"),
                        activeColor: Colors.green,
                      ),
                    ),
                    Flexible(
                      child: RadioListTile(
                        value: "Perempuan",
                        groupValue: gender,
                        onChanged: (String? value) {
                          setState(
                            () {
                              pilihGender(value);
                            },
                          );
                        },
                        title: Text("Perempuan"),
                        activeColor: Colors.green,
                      ),
                    ),
                  ],
                )),

                SizedBox(height: 8),
                TextFormField(
                  controller: pass,
                  keyboardType: TextInputType.visiblePassword,
                  obscureText: hiden,
                  decoration: InputDecoration(
                      hintText: 'Password',
                      suffixIcon: IconButton(
                        icon: Icon(
                            hiden ? Icons.visibility : Icons.visibility_off),
                        onPressed: visible,
                      ),
                      prefixIcon: Icon(Icons.lock_open),
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(
                  height: 15,
                ),
                MaterialButton(
                    height: 50,
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10)),
                    minWidth: MediaQuery.of(context).size.width / 2,
                    color: Colors.amber,
                    textColor: Colors.white,
                    child: Text("Submit"),
                    onPressed: () {

                        showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(20)),
                                title: Text("Informasi"),
                                content: Column(
                                  mainAxisSize: MainAxisSize.min,
                                  children: [
                                    Text("FullName: ${fullname.text}"),
                                    Text("Email : ${email.text}"),
                                    Text("Telphone: ${telp.text}"),
                                    Text("Alamat : ${alamat.text}"),
                                    Text("Password : ${pass.text}"),
                                    Text("Agama : $agama"),
                                    Text("Jenis Kelamin : $gender"),  //untuk alert dialog
                                  ],
                                ),
                              );
                            });
                      } 
                    }),
              ],
            ),

        ),
      ),
    );
  }
}

2. Maka Tampilannya akan seperti ini.

Registration Form

Password disana sudah saya tambahkan dengan obsecureText: hiden.

3. Hasil dari Alert Dialog.

4. Kemudian buat validasi pada registrasi tersebut.

 GlobalKey<FormState> _keyForm = GlobalKey<
      FormState>(); //menambahkan validasi misal kalau add kosong keluar merah

5. Kemudian Wrap Column pada registrasi menjadi Form();

 child: Form(

 key: _keyForm,
            autovalidateMode: AutovalidateMode.onUserInteraction,

);
            //tambahkan ini duluan ya pas form baru masuk ke validator dibawah textformfiled
            //untuk memvalidasi

6. Terakhir tambahkan kalimat validator pada setiap textformfield.

validator: (val) {
                    return val!.isEmpty ? "Fullname tidak boleh kosong" : null;
                  },

validator: (val) {
                    return val!.isEmpty ? "Email tidak boleh kosong" : null;
                  },
validator: (val) {
                    return val!.isEmpty ? "No Telp tidak boleh kosong" : null;
                  },
validator: (val) {
                    return val!.isEmpty ? "Alamat tidak boleh kosong" : null;
                  },
validator: (val) {
                    return val!.isEmpty ? "Password tidak boleh kosong" : null;
                  },

7. Terakhir tambahkan code berikut beserta showSnackBar

if (_keyForm.currentState!.validate()) {
} else {
        ScaffoldMessenger.of(context).showSnackBar(  
        SnackBar(content: Text("Masih Ada yang Kosong")));  //show snackbar
         }

8. Berikut hasil running registrasi dengan data yang kosong

Terlihat hasil snackbar memberi pesan “Masih ada yang kosong”.

9. Berikut hasil running registrasi data masih ada yang kosong.

Data alamat masih kosong

10. Berikut hasil running dengan registrasi berhasil

Berikut codingan lengkapnya ya teman-teman :

import 'package:flutter/material.dart';

class RegisterForm extends StatefulWidget {
  const RegisterForm({Key? key}) : super(key: key);

  @override
  _RegisterFormState createState() => _RegisterFormState();
}

class _RegisterFormState extends State<RegisterForm> {
  TextEditingController fullname = TextEditingController();
  TextEditingController email = TextEditingController();
  TextEditingController telp = TextEditingController();
  TextEditingController alamat = TextEditingController();
  TextEditingController pass = TextEditingController();
  
  String? agama;
  String? gender;
  GlobalKey<FormState> _keyForm = GlobalKey<
      FormState>(); //menambahkan validasi misal kalau add kosong keluar merah

//untuk gender
  void pilihGender(String? value) {
    setState(() {
      // untuk refresh value
      gender = value;
    });
  }

  List<String> listAgama = [
    'Islam',
    'Kristen Protestan',
    'Kristen Katolok',
    'Budha',
    'Hindu',
    'Konghucu'
  ];

  void pilihAgama(String? value) {
    // method untuk fungsi
    setState(() {
      agama = value;
    });
  }

//cara visibility
  bool hiden = true;
  void visible() {
    setState(() {
      hiden = !hiden;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.amber,
        title: Text("Register Form"),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(10.0),
          child: Form(
            //tambahkan ini duluan ya pas form baru masuk ke validator dibawah textformfiled
            //untuk memvalidasi
            key: _keyForm,
            autovalidateMode: AutovalidateMode.onUserInteraction,
            child: Column(
              children: [
                TextFormField(
                  validator: (val) {
                    return val!.isEmpty ? "Fullname tidak boleh kosong" : null;
                  },
                  controller: fullname,
                  decoration: InputDecoration(
                    hintText: 'FullName',
                    prefixIcon: Icon(Icons.person),
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10)),
                  ),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  validator: (val) {
                    return val!.isEmpty ? "Email tidak boleh kosong" : null;
                  },
                  controller: email,
                  keyboardType: TextInputType.emailAddress,
                  decoration: InputDecoration(
                    hintText: 'Email',
                    prefixIcon: Icon(Icons.email),
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10)),
                  ),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  validator: (val) {
                    return val!.isEmpty ? "No Telp tidak boleh kosong" : null;
                  },
                  controller: telp,
                  keyboardType: TextInputType.number,
                  decoration: InputDecoration(
                      prefixIcon: Icon(Icons.person),
                      hintText: 'No Telp',
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(
                  height: 8,
                ),
                TextFormField(
                  validator: (val) {
                    return val!.isEmpty ? "Alamat tidak boleh kosong" : null;
                  },
                  controller: alamat,
                  keyboardType: TextInputType.text,
                  maxLines: 2,
                  decoration: InputDecoration(
                      // prefixIcon: Icon(Icons.place),
                      hintText: 'Alamat',
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(height: 8),

                //tambah agama dropdownbutton
                Container(
                  padding: EdgeInsets.symmetric(horizontal: 8),
                  decoration: BoxDecoration(
                    border: Border.all(
                        width: 1, color: Colors.grey.withOpacity(0.5)),
                    borderRadius: BorderRadius.circular(10),
                  ),
                  child: DropdownButtonHideUnderline(
                    child: DropdownButton(
                      isExpanded: true,
                      value: agama,
                      hint: Padding(
                        padding: const EdgeInsets.all(10.0),
                        child: Text('Pilih Agama'),
                      ),
                      items: listAgama.map((e) {
                        return DropdownMenuItem(
                          child: Text(e),
                          value: e,
                        );
                      }).toList(),
                      onChanged: (String? value) {
                        setState(() {
                          pilihAgama(value);
                        });
                      },
                    ),
                  ),
                ),

                SizedBox(height: 8),


                //tambah gender dengan radio list tile
                Container(
                    child: Row(
                  children: [
                    Flexible(
                      child: RadioListTile(
                        value: "Laki Laki",
                        groupValue: gender,
                        onChanged: (String? value) {
                          setState(
                            () {
                              pilihGender(value);
                            },
                          );
                        },
                        title: Text("Laki Laki"),
                        activeColor: Colors.green,
                      ),
                    ),
                    Flexible(
                      child: RadioListTile(
                        value: "Perempuan",
                        groupValue: gender,
                        onChanged: (String? value) {
                          setState(
                            () {
                              pilihGender(value);
                            },
                          );
                        },
                        title: Text("Perempuan"),
                        activeColor: Colors.green,
                      ),
                    ),
                  ],
                )),

                SizedBox(height: 8),
                TextFormField(
                  validator: (val) {
                    return val!.isEmpty ? "Password tidak boleh kosong" : null;
                  },
                  controller: pass,
                  keyboardType: TextInputType.visiblePassword,
                  // obscureText: true,
                  obscureText: hiden,
                  decoration: InputDecoration(
                      hintText: 'Password',
                      suffixIcon: IconButton(
                        icon: Icon(
                            hiden ? Icons.visibility : Icons.visibility_off),
                        onPressed: visible,
                      ),
                      prefixIcon: Icon(Icons.lock_open),
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10))),
                ),
                SizedBox(
                  height: 15,
                ),
                MaterialButton(
                    height: 50,
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10)),
                    minWidth: MediaQuery.of(context).size.width / 2,
                    color: Colors.amber,
                    textColor: Colors.white,
                    child: Text("Submit"),
                    onPressed: () {
                      if (_keyForm.currentState!.validate()) {
                        // menambahkan validasi
                        showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(20)),
                                title: Text("Informasi"),
                                content: Column(
                                  mainAxisSize: MainAxisSize.min,
                                  children: [
                                    Text("FullName: ${fullname.text}"),
                                    Text("Email : ${email.text}"),
                                    Text("Telphone: ${telp.text}"),
                                    Text("Alamat  : ${alamat.text}"),
                                    Text("Password : ${pass.text}"),
                                    Text("Agama : $agama"),
                                    Text("Jenis Kelamin : $gender"),
                                  ],
                                ),
                              );
                            });
                      } else {
                        ScaffoldMessenger.of(context).showSnackBar(
                            SnackBar(content: Text("Masih Ada yang Kosong")));  //menambahkan snackbar
                      }
                    }),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Tidak sulit bukan? Selamat mencoba sobat Flutter 🙂