setState Her Yere Yetmiyor
Rebuild sınırını çizmeden paket seçmek

Not listesinden bir kayda girince başlık, etiketler ve dipnot aynı State içinde duruyordu. Dipnotu değiştirince liste de titredi. DevTools'ta rebuild flash'ı açınca ekranın tamamı sarıya boyandı. setState çalışıyordu; sözleşme yanlıştı.
İlk refleksim Riverpod veya Bloc eklemekti. Ekledim diye rebuild küçülmez. setState yerel ve senkron bir sinyal. Kardeş widget'ın haberini taşımaz, async boşluktan sonra güvenli değildir, ağacın üstüne yayılınca her çocuğu uyandırır.
setState kime ait
Bir StatefulWidget yalnızca kendi State nesnesini işaretler. Alanı oraya yığınca işaret büyür. Başlığı ayrı widget yapmak sihir değil; rebuild sınırını küçültür.
class NoteEditorPage extends StatefulWidget {
const NoteEditorPage({super.key, required this.noteId});
final String noteId;
@override
State createState() => _NoteEditorPageState();
}
class _NoteEditorPageState extends State {
late final TextEditingController _body;
bool _saving = false;
@override
void initState() {
super.initState();
_body = TextEditingController();
}
Future _save() async {
setState(() => _saving = true);
await NotesApi.save(widget.noteId, _body.text);
if (!mounted) return;
setState(() => _saving = false);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
NoteTitle(noteId: widget.noteId),
Expanded(child: TextField(controller: _body, maxLines: null)),
SaveBar(busy: _saving, onSave: _save),
],
);
}
}
NoteTitle kendi isteğini çekiyor, kendi setState'ini kullanıyor. Gövde yazınca başlık rebuild olmuyor. SaveBar yalnızca _saving değişince boyanıyor. Ekranın State'i hâlâ var; her pikselin sahibi o değil.
Kaldırmak ile yaymak
İki kardeş aynı sayaca bakıyorsa state'i ebeveyne kaldırmak doğru. Üçüncü, dördüncü, beşinci alanı da oraya tıkınca ebeveyn tanrı widget olur. O noktada paket değil, sınır konuşulur: hangisi gerçekten ortak?
- Yerel: imleç, açılır menü, bir satırın düzenleniyor olması.
- Paylaşılan: oturum, seçili defter, senkron kuyruğu.
- Ekran ötesi: bunları setState ile taşımak her rotada kopya üretir.
Bu yazıda paket önermiyorum. setState'i sildim demiyorum. Yetmediği yerde önce ağacı böldüm. Hâlâ yetmezse o zaman grafiğe bakıyorum; o ayrı bir yazının konusu.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap