【HarmonyOS 5】makeObserved接口详解

GeorgeGcs
• 阅读 9

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、makeObserved接口是什么? makeObserved 接口(API version 12 起可用)用于将非观察数据转为可观察数据,适用于三方包类、@Sendable 装饰的类、JSON.parse 返回的对象、collections.Array/Set/Map 等场景。 不支持 undefined和null类型。以及V1 状态装饰器(@State/@Prop)及已被观察的数据,避免双重代理。主要处理的是Object类型,非Object类型,例如基本数据类型number这种,都不支持。 需要注意的是,makeObserved主要针对的是V2的使用场景。因为它是为了解决 @Trace/@ObservedV2 无法覆盖的痛点观察需求。比如从网络请求返回的JSON对象,需要在UI上进行观测操作。就可使用makeObserved。所以V1使用@State就可解决的问题,不用考虑这个。 二、makeObserved如何使用? (1)接口调用 使用及其简单,只需要导入import { UIUtils } from '@kit.ArkUI'进行接口调用接口。麻烦的是识别你的入参是否支持观测监听。 import { UIUtils } from '@kit.ArkUI';

class UserInfo { id: number = 0; } let observedInfo: UserInfo = UIUtils.makeObserved(new UserInfo()); (2)可从操作的业务场景进行区分,符合以下三种场景一般可操作: 1、三方SDK包中的数据类,这种情况下需要UI可监测,因为无法手动添加@Trace,一般可支持。 【该场景较为简单,参考上面示例即可】 2、@Sendable装饰的类,因为禁止动态修改属性,一般可支持。 import { taskpool } from '@kit.ArkTS'; import { UIUtils } from '@kit.ArkUI';

// 定义@Sendable装饰的类(支持子线程传递) @Sendable class UserInfo { userId: number = 0; username: string = 'Guest'; score: number = 0; isOnline: boolean = false;

// 构造函数初始化数据 constructor(userId: number, username: string) { this.userId = userId; this.username = username; } }

// 子线程任务:模拟数据处理(如网络请求/复杂计算) @Concurrent function processDataInThread(userId: number): UserInfo { // 模拟耗时操作(子线程执行) let result = new UserInfo(userId, 'Loading...'); setTimeout(() => { // 模拟数据更新 result.score = Math.floor(Math.random() * 100); result.isOnline = true; }, 1000); return result; }

@Entry @ComponentV2 struct SendableMakeObservedDemo { // 主线程可观察数据:通过makeObserved包装@Sendable对象 @Local observedUser: UserInfo = UIUtils.makeObserved(new UserInfo(-1, '未登录'));

build() { Column({ space: 20 }) .width('100%') .padding(30) {

    Text('@Sendable + makeObserved 演示')
      .fontSize(24)
      .fontWeight(500)

    // 显示用户信息
    Text(`用户ID: ${this.observedUser.userId}`)
      .fontSize(18)

    Text(`用户名: ${this.observedUser.username}`)
      .fontSize(18)

    Text(`分数: ${this.observedUser.score}`)
      .fontSize(18)

    Text(`在线状态: ${this.observedUser.isOnline ? '在线' : '离线'}`)
      .fontSize(18)

    // 触发子线程任务的按钮
    Button('加载用户数据(子线程处理)')
      .onClick(() => {
        // 在子线程执行数据处理
        taskpool.execute(processDataInThread, 1001).then((user: UserInfo) => {
          // 子线程返回的@Sendable对象在主线程重新包装为可观察数据
          this.observedUser = UIUtils.makeObserved(user);
        });
      })

    // 本地修改数据的按钮(演示可观察性)
    Button('本地增加分数')
      .onClick(() => {
        this.observedUser.score += 10; // 直接修改属性,触发UI刷新
      })
  }

} }

3、 JSON.parse返回的匿名对象,一般是网络请求反馈,一般可支持。 import { UIUtils } from '@kit.ArkUI'; import { JSON } from '@kit.ArkTS';

// 定义 JSON 数据结构(示例接口) interface UserData { name: string; age: number; email: string; }

@Entry @ComponentV2 struct JsonMakeObservedDemo { // 原始 JSON 字符串 private rawJson: string = '{"name": "Alice", "age": 25, "email": "alice@example.com"}';

// 使用 makeObserved 包装 JSON.parse 返回的对象 @Local observedData: UserData = UIUtils.makeObserved(JSON.parse(this.rawJson) as UserData);

build() { Column({ space: 30 }) .width('100%') .padding(30) {

    // 显示 JSON 数据
    Text('JSON 可观察数据演示')
      .fontSize(24)
      .fontWeight(500)

    Text(`姓名: ${this.observedData.name}`)
      .fontSize(18)

    Text(`年龄: ${this.observedData.age}`)
      .fontSize(18)

    Text(`邮箱: ${this.observedData.email}`)
      .fontSize(18)

    // 修改姓名的按钮
    Button('修改姓名为 "Bob"')
      .onClick(() => {
        this.observedData.name = 'Bob'; // 直接修改属性,触发 UI 刷新
      })

    // 修改年龄的按钮
    Button('年龄 +1')
      .onClick(() => {
        this.observedData.age++; // 数值类型修改,触发 UI 刷新
      })

    // 重置为原始数据的按钮
    Button('重置数据')
      .onClick(() => {
        // 重新解析 JSON 并包装为可观察数据
        this.observedData = UIUtils.makeObserved(JSON.parse(this.rawJson) as UserData);
      })
  }

} }

三、注意

  1. getTarget问题: 通过getTarget获取原始对象后修改属性,不会触发UI刷新(需操作代理对象)
  2. 兼容性错误: 与@State等V1装饰器混用会抛异常,需使用V2装饰器(@Local/@Provide等)
点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
16小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
16小时前
【HarmonyOS 5】ArrayBuffer转Base64,Base64转ArrayBuffer,Uri转ArrayBuff,PixelMap转ArrayBuffer,图片Uri转为PixelMap
【HarmonyOS5】ArrayBuffer转Base64,Base64转ArrayBuffer,Uri转ArrayBuff,PixelMap转ArrayBuffer,图片Uri转为PixelMap\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类
GeorgeGcs GeorgeGcs
16小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
10小时前
从“备胎”到领航者,鸿蒙操作系统的传奇进化
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财【HarmonyOS5】2019年,在全球科技产业的风云变幻中,华为正式推出了鸿蒙操作系统(HarmonyOS),这一消息如同一颗重磅炸弹,瞬间吸引了全世界的目光。彼时,外界对鸿蒙的诞生背
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】金融应用开发鸿蒙组件实践
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙生态观察2024年1月18日:发布原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达8亿台;建设银行、邮储银行等完成鸿蒙原生应用Beta版本开发。2024年10
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙中的装饰器是什么?在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。因为ArkTS是TypeScript扩展而来的编程语言,Type
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中@State的原理详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、@State在鸿蒙中是做什么的?@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式。通过将变量标记为@State
GeorgeGcs GeorgeGcs
6小时前
【HarmonyOS 5】VisionKit人脸活体检测详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、VisionKit人脸活体检测是什么?VisionKit是HamronyOS提供的场景化视觉服务工具包。华为将常见的解决方案,通常需要三方应用使用SDK进行集成。华为以Kit的形式集成
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2