在这里插入图片描述

一、嵌套场景

多个InheritedWidget可以嵌套使用,每个管理自己的数据。

App

ThemeProvider

AuthProvider

UserInfoProvider

ChildWidget

二、嵌套Provider示例

UserInfoProvider(
  name: _name,
  age: _age,
  updateUserInfo: _updateUserInfo,
  child: DetailInfoProvider(
    address: _address,
    phone: _phone,
    updateDetailInfo: _updateDetailInfo,
    child: ChildWidget(),
  ),
)

三、查找顺序

查找

类型匹配?

不匹配

查找

匹配

子Widget

最近的Provider

返回数据

继续向上

上一层Provider

返回数据

四、作用域管理

Provider 作用域 影响范围
外层Provider 整个子树 所有子组件
内层Provider 内层子树 内层组件

五、UserInfoProvider实现

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!;
  }

  
  bool updateShouldNotify(UserInfoProvider oldWidget) {
    return name != oldWidget.name ||
        age != oldWidget.age ||
        email != oldWidget.email;
  }
}

六、最佳实践

按功能拆分

避免过度嵌套

控制层级数量

明确职责边界

合理管理依赖

原则 说明
职责分离 每个Provider负责一类数据
控制层级 建议2-3层
查找顺序 从最近到最远
内层优先 内层覆盖外层

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐