头图

鸿蒙Next(HarmonyOS NEXT)的用户首选项(Preferences)是为应用提供的一种轻量级数据持久化解决方案,它允许开发者以键值对的形式存储和检索数据。这种机制非常适合用于保存用户的个性化设置或应用的配置信息,例如主题颜色、字体大小、是否开启夜间模式等

特点

  1. 轻量级:用户首选项主要用于存储少量的数据,不适合用来存储大量的数据集。这是因为所有数据会被加载到内存中,过多的数据可能导致内存占用过高。建议分文件存储(如 uesrFile、configFile等)
  2. 快速访问:由于数据被缓存在内存中,因此读取速度非常快
  3. 同步与异步操作:提供了同步和异步两种方式来处理数据的读写操作
  4. 支持多种数据类型:键的类型为字符串型(不能重复),值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型(注: 这是一道鸿蒙基础认证考题)

Preferences 封装

对用户首选项进行封装,主要消除模版代码,提供下面几个能力

  1. 传入 fileName,获取指定的用户首选项
  2. 提供存储、删除、清空数据封装方法
  3. 提供 getConfig,使用泛型,进行数据转换

    import { preferences } from '@kit.ArkData'  
    import { hilog } from '@kit.PerformanceAnalysisKit'  
    import { BusinessError } from '@kit.BasicServicesKit';  
      
    const TAG: string = 'PreferenceUtil'  
      
    const CONFIG_FILE_NAME = 'configPreference'  // 文件名
    const FONT_SIZE_KEY = 'font_size_key'  // key
    const IS_FIRST_OPEN = 'is_first_open'  // key
      
    class PreferenceUtil {  
    
      private _preference?: preferences.Preferences | undefined;  
      
      getPreferenceFile(context: Context, fileName: string) {  
     this._preference = preferences.getPreferencesSync(context, { name: fileName })  
     return this  
      }
     
      // 获取首选项实例
      getConfigPreference(context: Context): PreferenceUtil {  
     return this.getPreferenceFile(context, CONFIG_FILE_NAME)  
      }
     
      // 保存信息,传入key、value
      saveConfig(key: string, value: preferences.ValueType) {  
     this._preference?.putSync(key, value)  
     this._preference?.flush((err: BusinessError) => {  
       if (err) {  
         hilog.error(0x000, TAG, 'save config failed code =' + err.code + ', message =' + err.message)  
       } else hilog.info(0x000, TAG, 'save config success')  
     })  
      }
     
      // 删除 key
      deleteKey(key: string) {  
     this._preference?.deleteSync(key)  
     this._preference?.flush((err: BusinessError) => {  
       if (err) {  
         hilog.error(0x000, TAG, 'delete config failed code =' + err.code + ', message =' + err.message)  
       } else hilog.info(0x000, TAG, 'delete config success')  
     })  
      }
     
      // 清除首选项内容
      clearPreference() {  
     this._preference?.clearSync()  
     this._preference?.flush((err: BusinessError) => {  
       if (err) {  
         hilog.error(0x000, TAG, 'clear config failed code =' + err.code + ', message =' + err.message)  
       } else hilog.info(0x000, TAG, 'clear config success')  
     })  
      }
     
      // T 泛型,返回该类型数据
      private getConfig<T>(name: string, defValue: preferences.ValueType): T {  
     return this._preference?.getSync(name, defValue) as T  
      }  
    
      // ====== 以下为封装的业务场景示例,可以删除
      getIsFirstOpen() {  
     return this.getConfig<boolean>(IS_FIRST_OPEN, false)  
      }  
      
      saveChangeFontSize(value: number) {  
     this.saveConfig(FONT_SIZE_KEY, value)  
      }  
      
      getChangeFontSize() {  
     return this.getConfig<number>(FONT_SIZE_KEY, 0)  
      }  
      
    }  
      
    export default new PreferenceUtil()

    使用方式(示例)

    ScreenFlow_副本.gif

    // 获取 字体大小 配置
    aboutToAppear() {  
      let context = this.getUIContext().getHostContext()  
      if (context) {  
       PreferenceUtil.getConfigPreference(context)  
       this.fontSizeOffset = PreferenceUtil.getChangeFontSize()  
      }
    }  
    
    // ... 省略代码
    // 保存 字体大小 配置
    Button('确认')  
      .width('156vp')  
      .height('41vp')  
      .margin({right: '16vp'})  
      .onClick(() => {  
     PreferenceUtil.saveChangeFontSize(13)  
     this.fontSizeOffset = this.currentValue  
      })
    

抠键盘养你
2 声望0 粉丝