initState() — gọi một lần khi widget được thêm vào (khởi tạo controller, listener). didChangeDependencies() — gọi sau initState và khi dependency thay đổi. build() — gọi thường xuyên, trả về widget tree. didUpdateWidget() — gọi khi parent rebuild với thuộc tính khác. dispose() — gọi một lần khi xóa (dọn dẹp tài nguyên, đóng stream).
Nắm rõ vòng đời này để tránh memory leak.
initState() is called once on insert. didChangeDependencies() is called after initState and when dependencies change. build() is called frequently. didUpdateWidget() is called when parent rebuilds with different properties. dispose() is called on removal — clean up resources here.