在这里插入图片描述

一、最佳实践基础

使用InheritedWidget时,遵循一些最佳实践可以让代码更加健壮和易维护。

设计原则

单一职责

一个Provider管理一种状态

精确更新

updateShouldNotify精确判断

类型安全

使用泛型和类型检查

清晰命名

Provider名称语义化

原则 说明 好处
单一职责 一个Provider只管理一种相关数据 降低耦合,易于维护
精确更新 只在真正需要时通知重建 提升性能,减少不必要渲染
类型安全 使用泛型确保类型正确 编译时发现错误
清晰命名 Provider和状态名称语义化 代码可读性更好

常见错误

35% 25% 20% 15% 5% 常见错误类型 总是通知 过度嵌套 职责混乱 命名不清晰 其他
错误类型 问题 解决方案
总是返回true 所有依赖Widget都重建 精确比较,只在变化时返回true
过度嵌套 Provider层级太深 按功能拆分,避免深层嵌套
职责混乱 一个Provider管理多个不相关状态 遵循单一职责原则
命名不清晰 Provider命名无语义 使用清晰的描述性名称

性能优化策略

true

false

Provider更新

updateShouldNotify

通知依赖组件

不通知

组件重建

保持原状

性能优化要点

  • 精确控制更新范围
  • 避免在build中创建新对象
  • 使用const构造函数
  • 合理使用Provider拆分

二、登录状态管理

通过登录状态示例学习InheritedWidget的最佳实践应用。

初始状态

用户登录

用户登出

刷新Token

LoggedOut

LoggedIn

二、AuthProvider实现

class AuthProvider extends InheritedWidget {
  final User? user;
  final bool isLoggedIn;
  final VoidCallback login;
  final VoidCallback logout;

  const AuthProvider({
    required this.user,
    required this.isLoggedIn,
    required this.login,
    required this.logout,
    required Widget child,
  }) : super(child: child);

  static AuthProvider of(BuildContext context) {
    final AuthProvider? result =
        context.dependOnInheritedWidgetOfExactType<AuthProvider>();
    assert(result != null, 'No AuthProvider found');
    return result!;
  }

  
  bool updateShouldNotify(AuthProvider oldWidget) {
    return user != oldWidget.user;
  }
}

三、登录流程

用户输入

验证通过?

显示错误

调用login

setState更新

AuthProvider重建

通知依赖组件

跳转首页

四、最佳实践原则

单一职责

一个Provider一类数据

命名清晰

类型安全

精确更新

性能优化

原则 说明 示例
单一职责 每个Provider管理一类数据 AuthProvider只管理登录
命名清晰 Provider和方法命名明确 login/logout
类型安全 使用强类型 User?而非dynamic
精确更新 只在必要时候通知 user != oldWidget.user

五、登录页面组件

class LoginPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final auth = AuthProvider.of(context);

    if (auth.isLoggedIn) {
      return const HomePage();
    }

    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              decoration: const InputDecoration(
                labelText: '用户名',
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 16),
            TextField(
              decoration: const InputDecoration(
                labelText: '密码',
                border: OutlineInputBorder(),
              ),
              obscureText: true,
            ),
            const SizedBox(height: 24),
            ElevatedButton(
              onPressed: auth.login,
              child: const Text('登录'),
            ),
          ],
        ),
      ),
    );
  }
}

六、权限检查示例

class ProtectedPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final auth = AuthProvider.of(context);

    if (!auth.isLoggedIn) {
      return const LoginPage();
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text('受保护的页面'),
        actions: [
          IconButton(
            icon: const Icon(Icons.logout),
            onPressed: auth.logout,
          ),
        ],
      ),
      body: const Center(
        child: Text('只有登录用户能看到此内容'),
      ),
    );
  }
}

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

Logo

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

更多推荐