HarmonyOS 开发实战:使用单例模式实现全局数据共享

前言

在 HarmonyOS 应用开发中,经常需要在不同页面、组件间共享数据和状态。今天分享一个实用工具类 GlobalThis,它基于单例模式实现全局数据存取,可以有效解决跨组件通信问题。

一、单例模式介绍

单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供一个全局访问点。这对于全局状态管理非常有用,避免了创建多个实例带来的资源浪费和状态不一致问题。

二、GlobalThis 类代码实现

import { common } from '@kit.AbilityKit';

// 构造单例对象
export class GlobalThis {
  private constructor() {}; // 私有构造函数,防止在外部使用new创建实例
  private static instance: GlobalThis; // 定义一个私有变量,保存类的唯一实例
  private _uiContexts = new Map<string, common.UIAbilityContext>();
  private _stringValues = new Map<string, string>(); // 字符串值
  private _numberValues = new Map<string, number>(); // 数字值
  private _boolValues = new Map<string, boolean>(); // 布尔值
  private _objectValues = new Map<string, object>(); // 对象值

  public static getInstance(): GlobalThis {
    if (!GlobalThis.instance) {
      GlobalThis.instance = new GlobalThis();
    }
    return GlobalThis.instance;
  }

  getContext(key: string): common.UIAbilityContext | undefined {
    return this._uiContexts.get(key);
  }

  setContext(key: string, value: common.UIAbilityContext): void {
    this._uiContexts.set(key, value);
  }

  // 字符串值方法
  setStringValue(key: string, value: string): void {
    this._stringValues.set(key, value);
  }

  getStringValue(key: string): string | undefined {
    return this._stringValues.get(key);
  }

  // 数字值方法
  setNumberValue(key: string, value: number): void {
    this._numberValues.set(key, value);
  }

  getNumberValue(key: string): number | undefined {
    return this._numberValues.get(key);
  }

  // 布尔值方法
  setBoolValue(key: string, value: boolean): void {
    this._boolValues.set(key, value);
  }

  getBoolValue(key: string): boolean | undefined {
    return this._boolValues.get(key);
  }

  // 对象值方法
  setObjectValue<T extends object>(key: string, value: T): void {
    this._objectValues.set(key, value);
  }

  getObjectValue<T extends object>(key: string): T | undefined {
    return this._objectValues.get(key) as T | undefined;
  }

  // 删除方法
  removeValue(key: string): boolean {
    return this._stringValues.delete(key);
  }

  removeContext(key: string): boolean {
    return this._uiContexts.delete(key);
  }
}

三、代码详解

  1. 单例实现:
  • 通过私有构造函数确保外部无法直接创建实例
  • 使用静态方法 getInstance() 获取唯一实例
  1. 数据存储:
  • 使用不同类型的 Map 存储各种类型数据
  • 支持存储字符串、数字、布尔值和对象类型
  • 支持存储 UIAbilityContext 对象用于页面跳转等操作
  1. 类型安全:
  • 利用 TypeScript 泛型确保对象存取的类型安全
  • 使用泛型 T 可以在获取时保留原有类型信息
  1. 数据操作方法:
  • 提供了各种类型的 setter 和 getter 方法
  • 支持删除已存储的值和上下文
     

四、简单使用示例

1. 存储和获取基本数据类型

// 获取单例对象
import { GlobalThis } from './utils/globalThis';

const global = GlobalThis.getInstance();

// 存储数据
global.setStringValue('appName', 'MyHarmonyApp');
global.setNumberValue('version', 1.0);
global.setBoolValue('isFirstLaunch', true);

// 获取数据
const appName = global.getStringValue('appName'); // "MyHarmonyApp"
const version = global.getNumberValue('version'); // 1.0
const isFirstLaunch = global.getBoolValue('isFirstLaunch'); // true

console.info(`应用名称: ${appName}, 版本: ${version}`);

 2. 存储和获取对象数据

// 定义一个简单的用户信息对象
interface UserInfo {
  id: string;
  name: string;
  isVip: boolean;
}

// 存储用户信息
const userInfo: UserInfo = {
  id: '123456',
  name: '张三',
  isVip: true
};

// 将对象存入全局
global.setObjectValue('currentUser', userInfo);

// 在其他地方获取用户信息
const currentUser = global.getObjectValue<UserInfo>('currentUser');
if (currentUser) {
  console.info(`当前用户: ${currentUser.name}, VIP状态: ${currentUser.isVip}`);
}

五、应用场景

  1. 全局配置管理:存储API地址、超时设置等
  1. 用户状态共享:跨页面共享登录信息
  1. 主题设置:全局主题切换
  1. 临时数据缓存:减少重复网络请求

六、注意事项

  1. 仅存储必要的共享数据,避免滥用
  1. 注意键名冲突问题
  1. 大型应用可能需要更复杂的状态管理解决方案

七、总结

GlobalThis类提供了一种简洁有效的全局数据共享方式,特别适合中小型HarmonyOS应用。通过合理使用,可以大幅简化组件间通信,提升开发效率。


欢迎关注我的CSDN博客,持续分享更多HarmonyOS开发技巧和最佳实践!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值