InheritedWidget là widget đặc biệt cho phép các widget con đọc dữ liệu từ tổ tiên mà không phải truyền tay qua từng cấp constructor. Provider, Theme, MediaQuery đều được dựng trên cơ chế này.
Hình dung nó như một "trạm phát" đặt cao trên cây: bất kỳ widget con nào cũng lấy được dữ liệu bằng context.dependOnInheritedWidgetOfExactType<T>() — thường bọc lại thành một static of(context).
class ThemeScope extends InheritedWidget {
const ThemeScope({required this.color, required super.child, super.key});
final Color color;
static ThemeScope of(BuildContext context) =>
context.dependOnInheritedWidgetOfExactType<ThemeScope>()!;
@override
bool updateShouldNotify(ThemeScope old) => color != old.color;
}Về hiệu năng: khi một widget con gọi of(context), nó đăng ký phụ thuộc. Lúc InheritedWidget dựng lại, Flutter dùng updateShouldNotify để quyết định có báo cho các widget phụ thuộc rebuild hay không — chỉ những widget thực sự đọc dữ liệu mới rebuild, không phải cả cây. Đó là lý do việc "truyền state xuống" ở đây rẻ hơn nhiều so với truyền prop thủ công.
Lưu ý: không gọi dependOnInheritedWidgetOfExactType trong initState() — đặt nó trong build() hoặc didChangeDependencies(). Khi chỉ cần đọc một lần mà không muốn rebuild theo, dùng getInheritedWidgetOfExactType — tương tự context.read() so với context.watch() của Provider.