
一、嵌套场景
多个InheritedWidget可以嵌套使用,每个管理自己的数据。
App
ThemeProvider
AuthProvider
UserInfoProvider
ChildWidget
二、嵌套Provider示例
dart
UserInfoProvider(
name: _name,
age: _age,
updateUserInfo: _updateUserInfo,
child: DetailInfoProvider(
address: _address,
phone: _phone,
updateDetailInfo: _updateDetailInfo,
child: ChildWidget(),
),
)
三、查找顺序
查找
类型匹配?
不匹配
查找
匹配
子Widget
最近的Provider
返回数据
继续向上
上一层Provider
返回数据
四、作用域管理
| Provider | 作用域 | 影响范围 |
|---|---|---|
| 外层Provider | 整个子树 | 所有子组件 |
| 内层Provider | 内层子树 | 内层组件 |
五、UserInfoProvider实现
dart
class UserInfoProvider extends InheritedWidget {
final String name;
final int age;
final String email;
final Function(String, int, String) updateUserInfo;
const UserInfoProvider({
required this.name,
required this.age,
required this.email,
required this.updateUserInfo,
required Widget child,
}) : super(child: child);
static UserInfoProvider of(BuildContext context) {
final UserInfoProvider? result =
context.dependOnInheritedWidgetOfExactType<UserInfoProvider>();
assert(result != null, 'No UserInfoProvider found');
return result!;
}
@override
bool updateShouldNotify(UserInfoProvider oldWidget) {
return name != oldWidget.name ||
age != oldWidget.age ||
email != oldWidget.email;
}
}
六、最佳实践
按功能拆分
避免过度嵌套
控制层级数量
明确职责边界
合理管理依赖
| 原则 | 说明 |
|---|---|
| 职责分离 | 每个Provider负责一类数据 |
| 控制层级 | 建议2-3层 |
| 查找顺序 | 从最近到最远 |
| 内层优先 | 内层覆盖外层 |
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net