鸿蒙 ArkTS-如何保存全局变量供各组件使用

使用PersistentStorage保存全局变量供各组件使用。

PersistentStorage和UI实例相关联,持久化操作需要在UI实例初始化成功后(即loadContent传入的回调被调用时)才可以被调用,早于该时机调用会导致持久化失败。如下:

onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  windowStage.loadContent('pages/Index',this.storage, (err) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return;
    }
// 一定在loadContent()回调时初始化PersistentStorage
    PersistentStorage.persistProp('token','');
    PersistentStorage.persistProp('nickName','');
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  });
}

后续赋值时,用AppStorage赋值即可,如下:

if (user?.email) {
  AppStorage.setOrCreate('token', user.token);
  AppStorage.setOrCreate('nickName', user.nickname);
...
}

也可以直接用@StorageLink使用

// EntryAbility.ets文件种初始化。
PersistentStorage.persistProp('guidelineId','2');//临时 指南版本
// 组件种直接使用
@StorageLink('guidelineId') guidelineId: number = 0;

当guidelineId值改变时,如:

this.guidelineId==2

persistProp的值guidelineId也同步更新

总结如下:

当状态变量@StorageLink(‘guidelineId’) aProp改变,触发组件重新刷新。

@StorageLink装饰的变量是和AppStorage中建立双向同步的,所以@StorageLink(‘guidelineId’) guidelineId的变化会被同步回AppStorage中。

AppStorage中“guidelineId”属性的改变会同步到所有绑定该“aProp”的单向或者双向变量。

因为“aProp”对应的属性已经被持久化,所以在AppStorage中“aProp”的改变会触发PersistentStorage,将新的改变写入本地磁盘。