Materi
Form mengelompokkan beberapa kolom isian supaya bisa diperiksa sekaligus. Setiap kolom berupa TextFormField dengan fungsi validator. Validator menerima teks yang diketik dan mengembalikan String berisi pesan galat bila isinya tidak sah. Bila isinya sah, validator wajib mengembalikan null; nilai lain, seperti true atau teks kosong, bukan cara menyatakan lolos.
final _formKey = GlobalKey<FormState>(); // field di State, dibuat sekali
// di dalam build:
Form(
key: _formKey,
child: Column(children: [
TextFormField(
decoration: const InputDecoration(labelText: 'Nama penerima'),
validator: (value) {
if (value == null || value.trim().isEmpty) return 'Nama wajib diisi';
return null;
},
),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
// semua validator mengembalikan null: data boleh diproses
}
},
child: const Text('Simpan'),
),
]),
)Form diberi GlobalKey<FormState>. Pemanggilan _formKey.currentState!.validate() menjalankan semua validator di dalam form. Bila semuanya mengembalikan null, validate() bernilai true. Bila ada yang mengembalikan pesan, form dibangun ulang untuk menampilkan pesan di bawah kolom yang bermasalah, dan validate() bernilai false. Kunci itu dibuat sekali sebagai field di State milik StatefulWidget, bukan di dalam build yang berjalan berulang.
Untuk membaca isi kolom di luar validator, pasang TextEditingController pada properti controller dan baca controller.text, yang selalu berisi teks terkini di kolom itu. Controller dibuat di State dan wajib dibersihkan dengan dispose() saat State dibuang.