BuildContext'i Async Gap'ten Sonra Kullanmak
await dönünce context hâlâ senin değil

Kayıt servisi 400 ms sürüyordu. await'ten sonra Navigator.pop ve bir SnackBar. Çoğu denemede sorun yoktu. Geri tuşuna basıp kaydı bekleyen kişi için State dispose olmuştu. context hâlâ eldeydi; Element ölüydü.
Hata mesajı deactivated widget diye bağırıyor. Okuyan kişi context'i suçluyor. Suç await ile kullanımın arasına giren boşluk. Boşlukta kullanıcı başka yere gidebilir, tema değişebilir, rota düşebilir.
mounted tek satır değil
Future submit(BuildContext context) async {
final messenger = ScaffoldMessenger.of(context);
final nav = Navigator.of(context);
final ok = await NotesApi.publish(draftId);
if (!context.mounted) return;
if (ok) {
nav.pop();
return;
}
messenger.showSnackBar(
const SnackBar(content: Text('Yayınlanamadı, taslak duruyor.')),
);
}
of(context) çağrılarını await'den önce almak, lookup'ı canlı ağaçta yapar. Sonra context.mounted ile hâlâ bu route'ta mıyım diye bakıyorum. SnackBar'ı ölü context ile açmak yerine sakladığım messenger'ı kullanıyorum.
of() da boşluğa düşer
Theme.of, MediaQuery.of — ikisi de o anki ağaca bağlı. await sonrası tekrar of demek, bazen çalışır, bazen assert atar. İhtiyacım olan değeri önce okuyorum. Rebuild istiyorsam setState veya listen; ölü context'ten tema çekmiyorum.
Bu bir stil kuralı değil, yaşam döngüsü. Async gap'i yok saymak, mutlu yolda yeşil test, geri tuşunda kırmızı log demek.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap