Widgets

InputField

Pengantar

Widget InputField adalah field teks yang disempurnakan dari Nylo Website dengan dukungan bawaan untuk:

  • Validasi dengan pesan error yang dapat dikustomisasi
  • Toggle visibilitas password
  • Masking input (nomor telepon, kartu kredit, dll.)
  • Widget header dan footer
  • Input yang dapat dihapus
  • Integrasi manajemen state
  • Data dummy untuk pengembangan

Penggunaan Dasar

final TextEditingController _controller = TextEditingController();

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: SafeArea(
      child: Padding(
        padding: EdgeInsets.all(16),
        child: InputField(
          controller: _controller,
          labelText: "Username",
          hintText: "Enter your username",
        ),
      ),
    ),
  );
}

Validasi

Gunakan parameter formValidator untuk menambahkan aturan validasi:

InputField(
  controller: _controller,
  labelText: "Email",
  formValidator: FormValidator.rule("email|not_empty"),
  validateOnFocusChange: true,
)

Field akan divalidasi saat pengguna memindahkan fokus dari field tersebut.

Handler Validasi Kustom

Tangani error validasi secara programatis:

InputField(
  controller: _controller,
  labelText: "Username",
  formValidator: FormValidator.rule("not_empty|min:3"),
  handleValidationError: (FormValidationResult result) {
    if (!result.isValid) {
      print("Error: ${result.getFirstErrorMessage()}");
    }
  },
)

Lihat semua aturan validasi yang tersedia di dokumentasi Validasi.

InputField.password

Field password yang sudah dikonfigurasi dengan teks tersembunyi dan toggle visibilitas:

final TextEditingController _passwordController = TextEditingController();

InputField.password(
  controller: _passwordController,
  labelText: "Password",
  formValidator: FormValidator.rule("not_empty|min:8"),
)

Menyesuaikan Visibilitas Password

InputField.password(
  controller: _passwordController,
  passwordVisible: true, // Show/hide toggle icon
  passwordViewable: true, // Allow user to toggle visibility
)

InputField.emailAddress

Field email yang sudah dikonfigurasi dengan keyboard email dan autofocus:

final TextEditingController _emailController = TextEditingController();

InputField.emailAddress(
  controller: _emailController,
  formValidator: FormValidator.rule("email|not_empty"),
)

InputField.capitalizeWords

Secara otomatis mengkapitalkan huruf pertama setiap kata:

final TextEditingController _nameController = TextEditingController();

InputField.capitalizeWords(
  controller: _nameController,
  labelText: "Full Name",
)

Masking Input

Terapkan mask input untuk data berformat seperti nomor telepon atau kartu kredit:

// Phone number mask
InputField(
  controller: _phoneController,
  labelText: "Phone Number",
  mask: "(###) ###-####",
  maskMatch: r'[0-9]',
  maskedReturnValue: false, // Returns unmasked value: 1234567890
)

// Credit card mask
InputField(
  controller: _cardController,
  labelText: "Card Number",
  mask: "#### #### #### ####",
  maskMatch: r'[0-9]',
  maskedReturnValue: true, // Returns masked value: 1234 5678 9012 3456
)
Parameter Deskripsi
mask Pola mask menggunakan # sebagai placeholder
maskMatch Pola regex untuk karakter input yang valid
maskedReturnValue Jika true, mengembalikan nilai berformat; jika false, mengembalikan input mentah

Header dan Footer

Tambahkan widget di atas atau di bawah field input:

InputField(
  controller: _controller,
  labelText: "Bio",
  header: Text(
    "Tell us about yourself",
    style: TextStyle(fontWeight: FontWeight.bold),
  ),
  footer: Text(
    "Max 200 characters",
    style: TextStyle(color: Colors.grey, fontSize: 12),
  ),
  maxLength: 200,
)

Input yang Dapat Dihapus

Tambahkan tombol hapus untuk mengosongkan field dengan cepat:

InputField(
  controller: _searchController,
  labelText: "Search",
  clearable: true,
  clearIcon: Icon(Icons.close, size: 20), // Custom clear icon
  onChanged: (value) {
    // Handle search
  },
)

Manajemen State

Berikan nama state pada field input Anda untuk mengontrolnya secara programatis:

InputField(
  controller: _controller,
  labelText: "Username",
  stateName: "username_field",
)

Aksi State

// Clear the field
InputField.stateActions("username_field").clear();

// Set a value
updateState("username_field", data: {
  "action": "setValue",
  "value": "new_value"
});

Parameter

Parameter Umum

Parameter Tipe Default Deskripsi
controller TextEditingController wajib Mengontrol teks yang sedang diedit
labelText String? - Label yang ditampilkan di atas field
hintText String? - Teks placeholder
formValidator FormValidator? - Aturan validasi
validateOnFocusChange bool true Validasi saat fokus berubah
obscureText bool false Sembunyikan input (untuk password)
keyboardType TextInputType text Tipe keyboard
autoFocus bool false Auto-fokus saat build
readOnly bool false Jadikan field hanya-baca
enabled bool? - Aktifkan/nonaktifkan field
maxLines int? 1 Jumlah baris maksimum
maxLength int? - Jumlah karakter maksimum

Parameter Styling

Parameter Tipe Deskripsi
backgroundColor Color? Warna latar belakang field
borderRadius BorderRadius? Radius border
border InputBorder? Border default
focusedBorder InputBorder? Border saat fokus
enabledBorder InputBorder? Border saat aktif
contentPadding EdgeInsetsGeometry? Padding internal
style TextStyle? Gaya teks
labelStyle TextStyle? Gaya teks label
hintStyle TextStyle? Gaya teks hint
prefixIcon Widget? Ikon sebelum input

Parameter Masking

Parameter Tipe Deskripsi
mask String? Pola mask (contoh: "###-####")
maskMatch String? Regex untuk karakter yang valid
maskedReturnValue bool? Mengembalikan nilai dengan mask atau mentah

Parameter Fitur

Parameter Tipe Deskripsi
header Widget? Widget di atas field
footer Widget? Widget di bawah field
clearable bool? Tampilkan tombol hapus
clearIcon Widget? Ikon hapus kustom
passwordVisible bool? Tampilkan toggle password
passwordViewable bool? Izinkan toggle visibilitas password
dummyData String? Data palsu untuk pengembangan
stateName String? Nama untuk manajemen state
onChanged Function(String)? Dipanggil saat nilai berubah