Hot Reload'a Güvenip State'i Kaybetmek
initState soğuk açılışta bir daha koşmaz

Editör sayfasına bir önbellek ekledim. Hot reload ile kaydettim, ekran durdu, yazı durdu, her şey iyi görünüyordu. Uygulamayı öldürüp açınca late field initialize olmadan okundu. Reload, State nesnesini korumuştu; soğuk açılış korumadı.
Hot reload bir süper güç. Aynı zamanda örtü. build metodunu değiştirmek reload ile görünür. initState, didChangeDependencies sırası, inherited yenileme, global tekil — bunlar restart ister. Restart istemeyen değişikliği 'çalışıyor' sanmak, kullanıcıya ilk soğuk açılışı bırakmak.
Reload neyi koşturmaz
State constructor'ı, initState, dispose'un tersi. Alanı late yapıp initState'de doldurmak, reload'da eski alanı yaşatır. Yeni alanı ekleyip okumak, reload'da LateInitializationError verebilir veya eski null'u saklar. İkisi de yalan.
class _EditorState extends State {
late final TextEditingController _body;
NoteDraft? _draft;
@override
void initState() {
super.initState();
_body = TextEditingController();
_load();
}
Future _load() async {
final draft = await DraftStore.read(widget.noteId);
if (!mounted) return;
setState(() {
_draft = draft;
_body.text = draft?.body ?? '';
});
}
@override
void didUpdateWidget(covariant EditorPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.noteId != widget.noteId) {
_load();
}
}
}
_load hem initState hem noteId değişiminde. Reload ile noteId değişmez; ben değiştirdiğimi sanırım. didUpdateWidget soğuk yolda da, sıcak yolda da aynı kapı. GlobalKey ile sayfayı yeniden kullanıyorsam bu kapı daha da önemli; Element durur, widget kimliği değişir.
Inherited ve tema
Theme veya locale'i ana ağaçta değiştirip reload etmek, dinleyen herkesin didChangeDependencies alacağı anlamına gelmez. Bazen alır, bazen eski TextStyle ile kalır. Locale listesini değiştiriyorsam hot restart. 'Göründü' yetmez.
Ne zaman restart
- Yeni bir alan, yeni bir controller, yeni bir listen.
- main() veya bootstrap, plugin kaydı, kanal adı.
- enum'a değer eklemek, JSON şemasını değiştirmek.
- İlk kez gördüğüm bir late veya null assert.
Reload ile layout kaydırmak serbest. Yaşam döngüsüne dokununca kırmızı yuvarlak. Bunu kural diye yazıyorum çünkü aksi halde aynı hatayı bir kez daha kullanıcıya bırakıyorum. Hot reload'u bırakmıyorum; ona güvenip state'i kaybetmiyorum.
Hot restart ile hot reload'u karıştırmak da ayrı bir örtü. Restart, Dart VM'i yeniden başlatır, native eklenti state'ini her zaman temizlemez. Kanal adı veya plugin kaydı değiştiyse uygulamayı öldürmek. Overlay'in yeşili, native tarafı bilmez.
Kısa özet: yeşil overlay, soğuk açılışın kanıtı değil. Kanıt, öldürüp açmak. Sıkıcı. Doğru.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap