AppStorageV2:鸿蒙全局状态管理详解-ArkUI本地存储

AppStorageV2:鸿蒙全局状态管理详解

AppStorageV2 是鸿蒙 ArkUI 中用于全局状态管理的高级特性,它提供了一种集中式的状态管理方案,让应用状态可以在整个应用范围内共享和响应式更新。下面我将用通俗易懂的方式解释 AppStorageV2 的核心概念和使用方法。

什么是 AppStorageV2?

AppStorageV2 可以理解为鸿蒙应用中的"全局状态仓库":

  • 它是整个应用共享的单一数据源
  • 可以被任何组件访问和修改
  • 状态变化会自动更新所有依赖该状态的组件UI
  • 支持持久化存储(可选)

核心特性

  1. 全局访问:任何组件都能访问存储在 AppStorage 中的数据
  2. 响应式绑定:UI 自动响应状态变化
  3. 类型安全:支持 TypeScript 类型检查
  4. 持久化选项:可将状态保存到设备持久存储
  5. API 统一:简单易用的 API 接口

基本使用

1. 定义状态

typescript 复制代码
// 定义全局状态
export class AppConfig {
@LocalStorageProp('theme') theme: 'light' | 'dark' = 'light';
@LocalStorageProp('fontSize') fontSize: number = 16;
@LocalStorageProp('isLoggedIn') isLoggedIn: boolean = false;
}

// 创建 AppStorage 实例
export const appStorage = new AppStorageV2(new AppConfig());

2. 在组件中使用

typescript 复制代码
@Entry
@Component
struct MainPage {
// 从 AppStorage 获取状态
@ProvideStorage(appStorage) config!: AppConfig;

build() {
Column() {
Text('当前主题: ' + this.config.theme)
.fontSize(this.config.fontSize)

Button('切换主题')
.onClick(() => {
// 修改全局状态
this.config.theme = this.config.theme === 'light' ? 'dark' : 'light';
})

// 嵌套的子组件
UserProfile()
}
}
}

3. 在子组件中访问

typescript 复制代码
@Component
struct UserProfile {
// 直接访问全局状态
@ProvideStorage(appStorage) config!: AppConfig;

build() {
Column() {
if (this.config.isLoggedIn) {
Text('欢迎回来!')
.fontSize(config.fontSize)
} else {
Button('登录')
.onClick(() => {
this.config.isLoggedIn = true;
})
}
}
}
}

实际应用案例:主题切换系统

下面是一个完整的主题切换系统实现:

typescript 复制代码
// 1. 定义全局状态模型
export class AppTheme {
@LocalStorageProp('appTheme') currentTheme: 'light' | 'dark' = 'light';
@LocalStorageProp('primaryColor') primaryColor: string = '#007AFF';
@LocalStorageProp('textSize') textSize: number = 16;

// 计算属性 - 根据主题返回背景颜色
get backgroundColor(): string {
return this.currentTheme === 'light' ? '#FFFFFF' : '#121212';
}

// 计算属性 - 根据主题返回文本颜色
get textColor(): string {
return this.currentTheme === 'light' ? '#000000' : '#FFFFFF';
}
}

// 2. 创建 AppStorage 实例
export const themeStorage = new AppStorageV2(new AppTheme());

// 3. 主题设置组件
@Component
struct ThemeSettings {
// 绑定全局状态
@ProvideStorage(themeStorage) theme!: AppTheme;

build() {
Column() {
Text('主题设置')
.fontSize(20)
.fontColor(this.theme.textColor)

Button(`切换至${this.theme.currentTheme === 'light' ? '深色' : '浅色'}主题`)
.onClick(() => {
this.theme.currentTheme = this.theme.currentTheme === 'light' ? 'dark' : 'light';
})
.margin(10)

Slider({
value: this.theme.textSize,
min: 12,
max: 24
})
.onChange((value: number) => {
this.theme.textSize = value;
})
.margin(10)

ColorPicker({ color: this.theme.primaryColor })
.onChange((color: string) => {
this.theme.primaryColor = color;
})
}
.padding(15)
.backgroundColor(this.theme.backgroundColor)
}
}

// 4. 主应用组件
@Entry
@Component
struct MyApp {
// 绑定全局主题状态
@ProvideStorage(themeStorage) theme!: AppTheme;

build() {
Column() {
Text('鸿蒙应用示例')
.fontSize(this.theme.textSize + 4)
.fontColor(this.theme.primaryColor)
.margin(20)

ThemeSettings()

Divider()

// 内容区域
Column() {
Text('这是应用内容区域')
.fontSize(this.theme.textSize)
.fontColor(this.theme.textColor)

// 其他应用内容...
}
.padding(15)
}
.width('100%')
.height('100%')
.backgroundColor(this.theme.backgroundColor)
}
}

高级功能

持久化存储

typescript 复制代码
// 定义全局状态
class PersistentSettings {
@LocalStorageProp('userId', { persistent: true }) userId: string = '';
@LocalStorageProp('lastLogin', { persistent: true }) lastLogin: number = Date.now();
}

// 创建持久化存储
export const persistentStorage = new AppStorageV2(
new PersistentSettings(),
{ storage: new LocalStorage() }
);

状态监听

typescript 复制代码
@Component
struct ThemeStatus {
@ProvideStorage(themeStorage) theme!: AppTheme;

aboutToAppear() {
// 监听主题变化
themeStorage.onChange('currentTheme', (newValue, oldValue) => {
console.log(`主题从 ${oldValue} 变为 ${newValue}`);
});
}

build() {
// ...
}
}

最佳实践

  1. 单一职责原则:每个 AppStorage 只管理一组相关状态
  2. 合理命名:使用有意义的属性名
  3. 最小化状态:只存储必要的全局状态
  4. 分离逻辑:将业务逻辑放在状态类中
  5. 谨慎使用持久化:避免存储敏感信息

与传统状态管理对比

特性 @State/@Link AppStorageV2
作用范围 组件内部 全局应用
共享难度 需要层层传递 直接访问
持久化 不支持 支持
复杂度 中高
适用场景 局部状态 全局状态

总结

AppStorageV2 是鸿蒙 ArkUI 中强大的全局状态管理解决方案:

  1. 提供集中式的状态管理
  2. 支持响应式UI更新
  3. 实现跨组件状态共享
  4. 可选持久化存储
  5. 类型安全且易于维护

通过合理使用 AppStorageV2,你可以构建更加健壮、可维护的鸿蒙应用,特别是在需要全局状态共享的场景(如用户设置、主题切换、用户认证等)下,它能显著简化状态管理逻辑。