Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check.dartuse_build_context_synchronously BuildContext get context

 

Peringatan “Don't use 'BuildContext's across async gaps” artinya kamu menggunakan BuildContext setelah await, dan itu bisa berbahaya, karena:

  • Setelah await, widget kamu mungkin sudah tidak aktif lagi di UI (unmounted).

  • Jika kamu pakai context setelah itu (misalnya Navigator.of(context) atau ScaffoldMessenger.of(context)), maka akan menyebabkan crash atau perilaku aneh.


 

Contoh kode yang salah

void someFunction() async {
  await Future.delayed(Duration(seconds: 2));
  Navigator.of(context).push(...); //  INI MASALAHNYA
}

Jika user keluar dari halaman sebelum await selesai, maka context sudah tidak valid, dan kamu tidak boleh lagi mengaksesnya.


 

Solusi: Gunakan mounted check

Kalau kamu di dalam class State<T>, Flutter menyediakan properti mounted untuk memastikan widget masih aktif di tree.

void someFunction() async {
  await Future.delayed(Duration(seconds: 2));

  if (!mounted) return; //  CEK DULU

  Navigator.of(context).push(...); //  Aman
}

 

Tips tambahan

  1. mounted hanya tersedia di dalam State class (bukan di StatelessWidget).

  2. Kalau kamu perlu pindahkan kode ke tempat lain (bukan State), hindari passing context ke async function, misalnya:

Future<void> login() async {
  final response = await auth.signIn(...);

  // Jangan langsung panggil context di sini
}

Sebaiknya pindahkan penggunaan context ke tempat yang bukan di dalam async method, atau lakukan pengecekan mounted terlebih dahulu.


 

Kesimpulan

  • Masalah: Kamu memakai context setelah await, yang berisiko jika widget sudah tidak aktif (unmounted).

  • Solusi: Tambahkan pengecekan if (!mounted) return; sebelum menggunakan context.

 

 

 

0 Comments:

Post a Comment