State object في StatefulWidget له دورة حياة — سلسلة من الطرق التي يتم استدعاؤها عند إنشاء الواجهة وتحديثها وتدميرها (initState، build، didUpdateWidget، dispose، إلخ). فهم دورة الحياة هذه مهم لإدارة الموارد والآثار الجانبية بشكل صحيح.
State object في StatefulWidget له دورة حياة — سلسلة من الطرق التي يتم استدعاؤها عند إنشاء الواجهة وتحديثها وتدميرها (initState، build، didUpdateWidget، dispose، إلخ). فهم دورة الحياة هذه مهم لإدارة الموارد والآثار الجانبية بشكل صحيح.
class _MyWidgetState extends State<MyWidget> {
@override
void initState() {
super.initState();
// called ONCE when the State is created → initialize, start subscriptions,
// fetch initial data, set up controllers/listeners
}
@override
Widget build(BuildContext context) {
// called whenever the UI needs to render (often) → return the widget tree
return Container();
}
@override
void didUpdateWidget(MyWidget oldWidget) {
super.didUpdateWidget(oldWidget);
// called when the parent rebuilds with new config → react to changed inputs
}
@override
void dispose() {
// called when the State is permanently removed → CLEAN UP:
// cancel subscriptions, dispose controllers, close streams (prevent leaks!)
super.dispose();
}
}
createState → initState (once) → build (many times) → [didUpdateWidget on config change]
→ ... → dispose (once, at the end)
Other: didChangeDependencies (when InheritedWidget dependencies change)
⚠️ dispose() is CRITICAL for cleanup — failing to clean up causes MEMORY LEAKS / bugs:
→ cancel Stream subscriptions, Timers; dispose AnimationControllers, TextEditingControllers,
ScrollControllers; close StreamControllers
→ resources started in initState should be cleaned up in dispose
→ A common source of leaks: forgetting to dispose controllers/subscriptions.
فهم دورة حياة StatefulWidget مهم لـ إدارة الموارد والآثار الجانبية بشكل صحيح في Flutter، لذا فهو معرفة عملية قيمة.
طرق دورة حياة State object يتم استدعاؤها في نقاط محددة، واستخدامها بشكل صحيح أمر ضروري: initState (يتم استدعاؤها مرة واحدة عند إنشاء State — المكان المناسب للتهيئة، وجلب البيانات الأولية، وبدء الاشتراكات، وإعداد التحكم والمستمعين)، build (يتم استدعاؤها كلما تم تصيير الواجهة، وتُرجع شجرة الواجهات)، didUpdateWidget (يتم استدعاؤها عند إعادة بناء الواجهة الأب بتكوين جديد، للرد على المدخلات المتغيرة)، و**dispose** (يتم استدعاؤها عند إزالة State بشكل دائم).
فهم التدفق النموذجي (createState → initState → build بشكل متكرر → dispose) يوضح متى يتم تشغيل كل واحد.
الأهم، فهم أن dispose ضروري للتنظيف هو معرفة عملية مهمة: عدم تنظيف الموارد (إلغاء اشتراكات Stream والمؤقتات، والتخلص من AnimationControllers و TextEditingControllers و ScrollControllers، وإغلاق StreamControllers) يسبب تسريب الذاكرة والأخطاء — والنسيان في التخلص من التحكم والاشتراكات هو مصدر شائع وحقيقي لتسريب الموارد في تطبيقات Flutter.
نمط إعداد الموارد في initState وتنظيفها في dispose أساسي لكتابة واجهات صحيحة خالية من التسريبات.
فهم دورة الحياة يمكّن التهيئة الصحيحة (في initState)، والرد على التغييرات (في didUpdateWidget)، والأهم التنظيف (في dispose).
حيث أن إدارة الموارد والآثار الجانبية بشكل صحيح ضروري لتطبيقات Flutter صحيحة خالية من التسريبات، وحيث أن دورة حياة StatefulWidget (خاصة initState للإعداد و dispose للتنظيف) هي الآلية لهذا، فإن فهم دورة حياة StatefulWidget — الطرق الرئيسية وتوقيتها، والدور الحرج لـ dispose في منع التسريبات — هي معرفة Flutter عملية ومهمة لكتابة واجهات stateful صحيحة، وهي مهارة رئيسية لتجنب تسريبات الموارد التي تمثل مشكلة حقيقية شائعة في Flutter.