Khi ứng dụng phình to, việc truyền dữ liệu từ Widget cha xuống các Widget con ở tầng sâu qua các constructor (Prop Drilling) sẽ khiến mã nguồn trở nên cực kỳ rối rắm và khó bảo trì.
1. Vấn đề “Prop Drilling” thực tế
Hãy tưởng tượng bạn có dữ liệu người dùng ở màn hình chính (Widget A), và bạn cần hiển thị nó ở nút bấm nằm sâu trong Widget Tree (Widget D). Bạn phải truyền qua B, C dù 2 Widget này không hề dùng đến dữ liệu đó. Điều này gây dư thừa constructor rất lớn.
2. Giải pháp nguyên bản của Flutter: InheritedWidget
InheritedWidget cho phép các Widget con nằm ở bất kỳ độ sâu nào trong cây thư mục đều có thể truy cập trực tiếp dữ liệu từ Widget cha thông qua cơ chế Context:
final myData = MyInheritedWidget.of(context).data;
Hệ thống sẽ tự động đăng ký lắng nghe và re-build lại Widget con khi dữ liệu của InheritedWidget thay đổi.
3. Hạn chế và Hướng đi tương lai
InheritedWidget viết code khá rườm rà. Vì vậy, các thư viện State Management hiện đại (như ScopedModel, Provider, Bloc) đều được xây dựng bọc lấy InheritedWidget để mang lại cú pháp lập trình đơn giản hơn.