harmony next 服务卡片实时刷新

此前今日事鸿蒙版卡片数据刷新还是有点问题。

问题:

安装应用后把卡片放到桌面,在app内新增一条数据,服务卡片不刷新,需要把app进程删除重新打开,才能正常刷新数据。

原因:

卡片渲染在系统进程,创建和调用都是系统触发,即EntryFormAbility里的代码其实运行在系统进程里面,跟app进程有内存隔离。没法做到数据实时共享。

懒得上图了,卡片交互流程直接上官网看吧。

这里主要解决问题。

需要通过harmony提供的跨进程通信模块

复制代码
import commonEventManager from '@ohos.commonEventManager'

来把卡片id发给app内进行保存,才能保证在app内能实时拿到卡片id,才能保证数据能刷新到卡片上。

核心代码:

复制代码
import commonEventManager from '@ohos.commonEventManager'

class SubscriberClass {
  event_form_id = "form_id"
  publishCount: number = 1
  subscriber?: commonEventManager.CommonEventSubscriber
  // 发布者
  publish(eventType: string ,data:string){
    // next中data支持导入类型
    commonEventManager.publish(eventType,{data},(err)=>{
      if(err){
        // 失败只发3次
        if(this.publishCount<=3){
          this.publishCount++
          this.publish(eventType,data)
        }else{
          this.publishCount = 1
        }
      }else{
        this.publishCount = 1
      }
    })
  }
  // 订阅者
  subscribe(eventType: string, callback:(event?: string)=>void){
    commonEventManager.createSubscriber({ events: [eventType] }, (err, sub) => {
      if (err) {
        return console.log('logData:', `创建订阅者error ${JSON.stringify(err)}`)
      }
      this.subscriber = sub
      if (this.subscriber !== null) {
        //订阅事件
        commonEventManager.subscribe(this.subscriber, (err, data) => {
          if (err) {
            return console.error(`logData`, '订阅事件失败')
          }
          callback(data.data)
        })
      } else {
        console.error('logData:',`需要创建subscriber`);
      }
    })
  }
}

export default new SubscriberClass()

这里简单构造了一个跨进程通信的发布与订阅的对象,在卡片EntryFormAbility调用publish,把formId发布出来。在App的EntryAbility中subscribe数据。

在EntryFormAbility的onAddForm中:

复制代码
SubscriberClass.publish(SubscriberClass.event_form_id, formId)

在EntryAbility的onWindowStateCreate中:

复制代码
SubscriberClass.subscribe(SubscriberClass.event_form_id, (data?: string) => {
      if (data) {
        CardManager.get().saveCardId(this.context, data)
      }
    })

这样,才能确保在APP中任意位置能更新到卡片:

复制代码
CardManager.get().updateCard()

多说无益,直接看源码吧

相关推荐
提子拌饭1333 小时前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
浮芷.6 小时前
Flutter 框架跨平台鸿蒙开发 - AR动物互动应用
flutter·ar·harmonyos
加农炮手Jinx8 小时前
Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
flutter·harmonyos·鸿蒙·openharmony
王码码20358 小时前
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石
flutter·harmonyos·鸿蒙·openharmony
见山是山-见水是水8 小时前
Flutter 框架跨平台鸿蒙开发 - AR植物养护助手
flutter·华为·ar·harmonyos
autumn20059 小时前
Flutter 框架跨平台鸿蒙开发 - 历史人物对话
服务器·flutter·华为·harmonyos
autumn20059 小时前
Flutter 框架跨平台鸿蒙开发 - 社区闲置循环
flutter·华为·harmonyos
chenbin___9 小时前
在鸿蒙手机上,measure 和 measureInWindow 返回的 y / pageY 在滑动组件后值不变问题
华为·智能手机·harmonyos
浮芷.10 小时前
Flutter 框架跨平台鸿蒙开发 - 家庭健康监测云应用
科技·flutter·华为·harmonyos·鸿蒙
世人万千丶11 小时前
Flutter 框架跨平台鸿蒙开发 - 宠物语言翻译器应用
学习·flutter·华为·开源·harmonyos·鸿蒙