State object ของ StatefulWidget มี lifecycle — ลำดับของ method ที่ถูกเรียกเมื่อ widget ถูกสร้าง อัปเดต และทำลาย (initState, build, didUpdateWidget, dispose เป็นต้น) การเข้าใจมันเป็นสิ่งสำคัญต่อการจัดการทรัพยากรและ side effect อย่างถูกต้อง
State object ของ StatefulWidget มี lifecycle — ลำดับของ method ที่ถูกเรียกเมื่อ widget ถูกสร้าง อัปเดต และทำลาย (initState, build, didUpdateWidget, dispose เป็นต้น) การเข้าใจมันเป็นสิ่งสำคัญต่อการจัดการทรัพยากรและ side effect อย่างถูกต้อง
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.
การเข้าใจ lifecycle ของ StatefulWidget เป็นสิ่งสำคัญต่อการ จัดการทรัพยากรและ side effect อย่างถูกต้อง ใน Flutter จึงเป็นความรู้เชิงปฏิบัติที่มีคุณค่า
lifecycle method ของ State object ถูกเรียกในจุดเฉพาะ และการใช้พวกมันอย่างถูกต้องเป็นสิ่งจำเป็น: initState (ถูกเรียกครั้งเดียวเมื่อ State ถูกสร้าง — ที่สำหรับ initialize ดึงข้อมูลเริ่มต้น เริ่ม subscription และตั้งค่า controller/listener) build (ถูกเรียกทุกครั้งที่ UI เรนเดอร์ คืนค่า widget tree) didUpdateWidget (ถูกเรียกเมื่อ parent rebuild ด้วยการกำหนดค่าใหม่ สำหรับการตอบสนองต่อ input ที่เปลี่ยน) และ dispose (ถูกเรียกเมื่อ State ถูกลบออกอย่างถาวร)
การเข้าใจ flow ทั่วไป (createState → initState → build ซ้ำ ๆ → dispose) ช่วยให้เข้าใจชัดเจนว่าแต่ละอันรันเมื่อใด
ที่สำคัญที่สุด การเข้าใจว่า dispose เป็นสิ่งจำเป็นสำหรับการ cleanup เป็นความรู้เชิงปฏิบัติที่สำคัญ: การไม่ cleanup ทรัพยากร (การยกเลิก Stream subscription และ Timer การ dispose AnimationController, TextEditingController และ ScrollController การปิด StreamController) ทำให้เกิด memory leak และบั๊ก — และการลืม dispose controller และ subscription เป็นแหล่งที่มาของ leak ที่พบบ่อยและเกิดขึ้นจริงในแอป Flutter
รูปแบบการตั้งค่าทรัพยากรใน initState และ cleanup ใน dispose เป็นพื้นฐานในการเขียน widget ที่ถูกต้องและปราศจาก leak
การเข้าใจ lifecycle ช่วยให้สามารถ initialize อย่างเหมาะสม (ใน initState) ตอบสนองต่อการเปลี่ยนแปลง (ใน didUpdateWidget) และที่สำคัญคือ cleanup (ใน dispose)
เนื่องจากการจัดการทรัพยากรและ side effect อย่างถูกต้องเป็นสิ่งจำเป็นต่อแอป Flutter ที่ถูกต้องและปราศจาก leak และเนื่องจาก lifecycle ของ StatefulWidget (โดยเฉพาะ initState สำหรับการตั้งค่าและ dispose สำหรับการ cleanup) เป็นกลไกสำหรับสิ่งนี้ การเข้าใจ lifecycle ของ StatefulWidget — method สำคัญ จังหวะเวลาของพวกมัน และโดยเฉพาะบทบาทสำคัญของ dispose ในการป้องกัน leak — จึงเป็นความรู้ Flutter ที่สำคัญและเกี่ยวข้องในทางปฏิบัติสำหรับการเขียน stateful widget ที่ถูกต้อง ทักษะสำคัญในการหลีกเลี่ยง resource leak ที่เป็นปัญหา Flutter ที่พบบ่อยในโลกจริง