Kenapa Harus Pakai Underscore _ di Depan Fungsi atau Variabel di Flutter (Dart)?

Kalau kamu baru belajar Flutter, mungkin sering ketemu kode seperti ini:

ElevatedButton(
  onPressed: _isLoading ? null : _login,
  child: _isLoading
      ? const CircularProgressIndicator()
      : const Text('Login'),
)

Lalu mungkin muncul pertanyaan:
“Kenapa sih kok fungsi login ditulis _login pakai underscore, bukan cuma login aja?”

Nah, artikel ini akan membahas dengan detail fungsi underscore di Dart/Flutter dan kenapa banyak developer lebih memilih menulis _login dibanding login.

1. Dart Punya Aturan Soal Underscore _

Kalau di bahasa lain (seperti Python atau JavaScript), underscore di depan nama variabel/fungsi sering dipakai hanya sebagai gaya penamaan (convention).
Tapi di Dart, underscore punya arti teknis yang penting:

Underscore di awal nama berarti private (hanya bisa diakses di file/library yang sama).

Artinya, kalau kamu bikin:

void _login() {
  print("Ini fungsi private");
}

Maka fungsi _login tidak bisa dipanggil dari file lain.
Tapi kalau kamu bikin:

void login() {
  print("Ini fungsi public");
}

Maka fungsi login bisa dipanggil dari mana saja selama file tersebut di-import.

2. Kenapa Developer Flutter Sering Pakai _?

Biasanya, dalam sebuah aplikasi Flutter, banyak fungsi atau variabel yang hanya dipakai di dalam satu widget atau state.

Contoh: tombol login di halaman login.
Apakah fungsi login ini perlu diakses dari luar? Jawabannya: nggak perlu.

Makanya, developer menulisnya begini:

class _LoginPageState extends State<LoginPage> {
  bool _isLoading = false;

  void _login() {
    setState(() {
      _isLoading = true;
    });

    // logika login di sini
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _isLoading ? null : _login,
      child: _isLoading
          ? const CircularProgressIndicator()
          : const Text('Login'),
    );
  }
}

Perhatikan:

  • Variabel _isLoading → hanya dipakai di dalam class ini.

  • Fungsi _login → hanya untuk tombol login di halaman ini.

Kalau dibuat public (login), maka fungsi itu bisa saja dipanggil dari luar file. Padahal, itu tidak ada gunanya.
Maka solusinya → kasih underscore (_login).

3. Bedanya login vs _login

Biar lebih jelas, kita lihat contoh nyata:

File auth.dart

void login() {
  print("Fungsi login PUBLIC");
}

void _login() {
  print("Fungsi login PRIVATE");
}

File main.dart

import 'auth.dart';

void main() {
  login();   //  Bisa dipanggil
  _login();  //  ERROR: _login is private and only accessible within 'auth.dart'
}

Dari contoh ini kelihatan jelas perbedaannya:

  • login() → bisa dipanggil dari file mana saja (public).

  • _login() → hanya bisa dipanggil dari file tempat dia didefinisikan (private).

4. Kapan Harus Pakai _?

Gunakan underscore _ ketika:

  • Variabel/fungsi hanya dipakai di dalam satu file.

  • Kamu tidak ingin orang lain (atau file lain) mengakses langsung variabel/fungsi tersebut.

  • Contoh: _login, _isLoading, _fetchData, _controller.

Gunakan tanpa underscore ketika:

  • Variabel/fungsi memang harus bisa diakses dari luar file.

  • Contoh: loginUser, ApiService, UserModel, dll.

Jadi, alasan kenapa di Flutter (dan Dart) sering pakai _login ketimbang login adalah:

  1. Underscore berarti private → hanya bisa diakses di file yang sama.

  2. Lebih aman → mencegah akses yang tidak sengaja dari luar file.

  3. Lebih rapi → kode jadi jelas mana yang internal/private, mana yang public.

Dengan kata lain, kalau fungsi itu hanya dipakai oleh widget tertentu (seperti tombol login), pakailah _login. Tapi kalau fungsi itu harus dipakai banyak file, barulah gunakan login tanpa underscore.

Nah, sekarang sudah jelas kan kenapa _login itu penting?
Kalau kamu baru belajar Flutter, biasakan bedakan fungsi private (pakai _) dan fungsi public (tanpa _) supaya kode kamu lebih clean, aman, dan gampang dirawat. 


0 Comments:

Post a Comment