- setState: state cục bộ (ephemeral) trong một widget. Đơn giản nhưng không chia sẻ được rộng.
- InheritedWidget / provider: đưa state lên cao rồi cho con đọc theo context;
package:providerbọc lại cho tiện, phổ biến vì ít boilerplate. - Riverpod: như provider nhưng không phụ thuộc BuildContext, kiểm tra ở compile-time, dễ test và tránh lỗi provider-not-found.
- BLoC / Cubit: tách UI khỏi logic qua luồng event → state (Stream). Rõ ràng, dễ test, hợp app lớn nhiều team; đổi lại nhiều boilerplate.
Chọn theo quy mô: state cục bộ → setState; app vừa → Provider/Riverpod; app lớn cần kỷ luật luồng dữ liệu → BLoC.