鸿蒙——首选项

1、首选项是什么

Preferences:鸿蒙轻量级 键值对存储,核心用于持久化保存用户/应用的轻量配置(数字、字符串、布尔等简单类型)

2、Preference步骤

简单可概括为:实例化-存入内存中-关闭之后丢失

具体操作流程:

  • 实例化(getPreferencesSync):获取操作句柄(打开 "记事本")
  • putSync(key, value):把数据写入内存 缓存区(记事本里临时写内容未保存)
  • flush() :将内存缓存区的数据刷入本地文件(保存到硬盘,真正持久化)

若只putSync不flush:应用进程退出后,内存数据丢失,本地文件无更新

读取流程:

getSync(key, 默认值):先读内存缓存 → 内存无则读本地文件 → 文件无则返回默认值。

注意:生命周期函数的核心逻辑(读写preferences)依赖UIAbilityContext,所以才需要先获取它。即preferences必须传入UIAbilityContext作为参数,才能定位到对应存储 空间(preferences是基于 UIAbility 维度隔离存储)。

3、具体详细介绍

获取上下文

private cpntext:common.UIAbilityContext =getContext(this) as common.UIAbilityContext

核心作用:获取 当前页面所属的UIAbility上下文

重要内容细解:

|------------------|----------------------------|
| getContext(this) | as common.UIAbilityContext |
| 在当前index组件得到上下文 | 确保获取的类型是UIAbilityContext类型 |

cpntext:这个是具体的上下文名称,可改变

UIAbility :是鸿蒙应用的核心组件,管理页面生命周期、资源等

页面生命周期函数

1、onPageShow()

定义:页面显示时触发 (如首次打开、从后台切回、从其他页面返回)可简单理解为操作

核心逻辑:读取持久化存储的字体大小,赋值给fontsize(上一次的字体大小)

详解:

let preinsttamce = preferences.getPreferencesSync(this.cpntext,{name:'fonsize-01'})

preferences.getPreferencesSync():同步获取preferences实例(Sync表示同步 方法,无回调

参数 1:this.cpntext → UIAbility 上下文(定位存储空间)

参数 2:{name:'fonsize-01'} → 存储文件的名称(自定义,相同名称为同一套键值对)

作用:创建 / 打开名为fonsize-01的 preferences 存储实例,后续通过该实例读写数据

this.fontsize =preinsttamce.getSync('j',20) as number

  • preinsttamce.get Sync('j',20):从 preferences 实例中同步读取键值对
  • as number:类型断言,确保读取的值是数字类型

参数 1:'j' → 要读取的键名(自定义,这里用j 表示字体大小的键)

参数 2:20 → 默认值(如果键j不存在,返回 20)

作用:将读取到的字体大小赋值给fontsize,页面显示时自动应用该值。

2、onPageHide()

定义:页面隐藏时触发(如切到后台、跳转到其他页面、关闭页面),可简单理解为操作

核心逻辑:将当前的fontsize值保存到 preferences,实现 "修改后持久化";

详解:

let option:preferences.Options={name:"fonsize-01"}

理解:定义preferences的配置项,指定存储文件名称为fonsize-01;preferences.Options:鸿蒙内置类型,约束配置项的格式(TypeScript 类型)。

let preinsttamce = preferences.getPreferencesSync(this.cpntext,option)

获取名为fonsize-01的 preferences 实例-->打开文件

preinsttamce.putSync('j',this.fontsize)

put Sync(key, value):同步写入键值对

键:'j'(和读取时的键一致),值:当前的fontsize(用户修改后的字体大小)

注意:putSync只是写入内存,未真正保存到本地文件。

preinsttamce.flush()

核心:将内存中的键值对持久化到本地文件(如果不调用 flush,修改只会留在内存,页面重启后丢失)

作用:确保字体大小的修改被真正保存

总体代码实现

复制代码
import { common } from '@kit.AbilityKit';
import { preferences } from '@kit.ArkData';

@Entry
@Component
struct Preference {
  @State fontsize:number = 30;
  private cpntext:common.UIAbilityContext =getContext(this) as  common.UIAbilityContext  //上下文
  //自定义生命周期
  //显示时
  onPageShow(): void
  {
    let preinsttamce = preferences.getPreferencesSync(this.cpntext,{name:'fonsize-01'})
    this.fontsize =preinsttamce.getSync('j',20) as number //赋值
  }
  //隐藏时
  onPageHide(): void {
    let option:preferences.Options={name:"fonsize-01"}
    let preinsttamce = preferences.getPreferencesSync(this.cpntext,option)
    preinsttamce.putSync('j',this.fontsize) //保存当前字体大小
    preinsttamce.flush() //持久化
  }
  build() {
    Column(){
      Text('SXSXSXSXSXSXSX').height(90).fontSize(this.fontsize)
      //文本框输入-将字体大小与输入值绑定
      TextInput({placeholder:'输入大小'}).width('100%').margin(10)
        .onChange((value)=>{
          this.fontsize=Number.parseInt(value)
        })
    }
    .height('100%')
    .width('100%')
  }

扩展内容:

鸿蒙Stage 模型下的 UI 页面组件(Index),核心功能是:展示可动态调整字体大小的文本;

通过文本输入框修改字体大小;利用鸿蒙的preferences(首选项)持久化存储字体大小,页面隐藏 / 显示时自动保存 / 读取配置。

为什么是这个模型,因为

  • 依赖 Stage 模型的 UIAbilityContext
  • 遵循 Stage 模型 preferences 的调用规则
  • 页面生命周期(onPageShow/onPageHide)也是 Stage 模型组件的核心生命周期
相关推荐
lbb 小魔仙3 小时前
【HarmonyOS实战】React Native 表单实战:在 OpenHarmony 上构建高性能表单
react native·华为·harmonyos
一只大侠的侠5 小时前
React Native开源鸿蒙跨平台训练营 Day16自定义 useForm 高性能验证
flutter·开源·harmonyos
早點睡3906 小时前
高级进阶 React Native 鸿蒙跨平台开发:@react-native-community-slider 滑块组件
react native·react.js·harmonyos
一只大侠的侠7 小时前
Flutter开源鸿蒙跨平台训练营 Day11从零开发商品详情页面
flutter·开源·harmonyos
一只大侠的侠7 小时前
React Native开源鸿蒙跨平台训练营 Day18自定义useForm表单管理实战实现
flutter·开源·harmonyos
一只大侠的侠7 小时前
React Native开源鸿蒙跨平台训练营 Day20自定义 useValidator 实现高性能表单验证
flutter·开源·harmonyos
听麟8 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
前端世界8 小时前
从单设备到多设备协同:鸿蒙分布式计算框架原理与实战解析
华为·harmonyos
一只大侠的侠9 小时前
Flutter开源鸿蒙跨平台训练营 Day12从零开发通用型登录页面
flutter·开源·harmonyos
前端不太难10 小时前
HarmonyOS App 工程深水区:从能跑到可控
华为·状态模式·harmonyos