Learn
← Previous Next →

Hari 19: Form & Input Validation

60 min Last updated 09 Apr 2026

Form di Flutter

import "package:flutter/material.dart";

class FormRegistrasi extends StatefulWidget {
  @override _FormRegistrasiState createState() => _FormRegistrasiState();
}

class _FormRegistrasiState extends State {
  final _formKey = GlobalKey();
  final _namaCtrl = TextEditingController();
  final _emailCtrl = TextEditingController();
  final _passCtrl = TextEditingController();

  @override
  void dispose() {
    _namaCtrl.dispose();
    _emailCtrl.dispose();
    _passCtrl.dispose();
    super.dispose();
  }

  void _submit() {
    if (_formKey.currentState!.validate()) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("Registrasi berhasil!")),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(children: [
        TextFormField(
          controller: _namaCtrl,
          decoration: InputDecoration(labelText: "Nama"),
          validator: (v) {
            if (v == null || v.isEmpty) return "Nama wajib diisi";
            if (v.length < 3) return "Nama minimal 3 karakter";
            return null;
          },
        ),
        TextFormField(
          controller: _emailCtrl,
          decoration: InputDecoration(labelText: "Email"),
          validator: (v) {
            if (v == null || v.isEmpty) return "Email wajib diisi";
            if (!RegExp(r"^[\w-]+@[\w-]+\.\w+$").hasMatch(v)) return "Email tidak valid";
            return null;
          },
        ),
        ElevatedButton(onPressed: _submit, child: Text("Daftar")),
      ]),
    );
  }
}

💡 Notice: Validator mengembalikan String? — null berarti valid, String berarti error message.

Assignment

Buat validator untuk nama, email, dan password dengan berbagai aturan.

Expected output:

nama: Bu → Minimal 3 karakter
nama: Budi Santoso → VALID
email: bukan-email → Format email tidak valid
email: budi@test.com → VALID
password: abc123 → Minimal 8 karakter
password: SecurePass1 → VALID
Dart main.dart
Solution
Output