Runtime ErrorDartFlutterNull Safety6 mnt baca

Mengatasi Null check operator used on null value di Dart

Crash Flutter paling umum dari null safety: operator ! dipakai pada nilai yang ternyata null.

1 · Gejala & Log Pesan Error

error.log
Null check operator used on null value
#0      _HomePageState.build (package:app/main.dart:58:32)
#1      StatefulElement.build (package:flutter/src/widgets/framework.dart:...)
...
Another exception was thrown during a service extension callback.

2 · Akar Penyebab Masalah

Kamu Berjanji "Pasti Tidak Null", Ternyata Null

Operator ! (null check operator) adalah janjimu ke compiler: "nilai ini pasti tidak null, percaya padaku". Compiler percaya dan mematikan pemeriksaannya. Kalau saat runtime nilainya ternyata null, aplikasi crash seketika tanpa ampun.

Ini sering terjadi pada:

  • Data dari API yang field-nya ternyata kosong untuk sebagian item.
  • Controller/variabel yang diinisialisasi belakangan (late) tapi dipakai sebelum siap.
  • Hasil find/pencarian yang tidak ketemu lalu dipaksa dengan !.

3 · Solusi & Diff Kode

✕ Sebelum (bermasalah)

before
// ❌ crash kalau user.name ternyata null
Text(
  user.name!, // janji palsu
  style: const TextStyle(fontSize: 18),
);

// ❌ pola berbahaya lain
final foto = user.photo!;
Image.network(foto);

✓ Sesudah (diperbaiki)

after
// ✔ beri default yang masuk akal
Text(
  user.name ?? "Pengguna",
  style: const TextStyle(fontSize: 18),
);

// ✔ atau tampilkan widget berbeda saat null
if (user.photo == null) {
  return const Icon(Icons.person);
}
return Image.network(user.photo!); // aman: sudah dicek di atas

Langkah Perbaikan

  1. Lihat nomor baris di stack trace: itulah lokasi ! yang berkhianat.
  2. Tanya: bisakah nilai ini null di dunia nyata? Kalau ya (data API, input user, hasil pencarian), ! adalah pilihan yang salah.
  3. Ganti dengan yang jujur:
    • ?? default kalau ada nilai fallback yang masuk akal.
    • if (x == null) + early return / widget alternatif kalau null butuh penanganan khusus.
    • ?. untuk memanggil method dengan aman: user.name?.toUpperCase().
  4. Aturan praktis: ! hanya untuk kasus yang kamu bisa buktikan tidak null (mis. setelah if (x != null) di baris sebelumnya, atau inisialisasi yang pasti terjadi di initState). Sisanya, tangani null-nya.