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. Nó là cơ chế nền tảng mà Provider, Theme, MediaQuery đều dựng trên đó.
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).
dart
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;
}Điểm mấu chốt về hiệu năng: khi một widget con gọi of(context), nó đăng ký phụ thuộc.
- Lúc
InheritedWidgetdựng lại, Flutter dùngupdateShouldNotifyđể 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.