【FAQ】HarmonyOS SDK 闭源开放能力 — Form Kit

1.问题描述:

主app进入后台,此时切换系统菜单暗黑模式按钮,卡片如何监听系统colorMode ,此时卡片如何做暗黑模式切换?

解决方案:

适配方案依靠资源目录,当系统对应的设置项发生变化后(如系统语言、深浅色模式等),应用会自动加载对应资源目录下的资源文件。系统为深色模式预留了dark目录,该目录在应用创建时默认不存在,在进行深色模式适配时,需要开发者在src/main/resources中手动创建出dark目录,将深色模式所需的资源放置到该目录下。对于浅色模式所需的资源,可以放入默认存在的src/main/resources/base目录下。具体步骤为:

  1. 在src/main/resources/base/element/color.json文件中定义页面元素在浅色模式下的颜色值。

    Json 复制代码
    {
    
      "color": [
    
        {
    
          "name": "text_color",
    
          "value": "#000000"
    
        }
    
      ]
    
    }
  2. 在src/main/resources/dark/element/color.json文件中定义页面元素在浅色模式下的颜色值。

    Json 复制代码
    {
    
      "color": [
    
        {
    
          "name": "text_color",
    
          "value": "#FFFFFF"
    
        }
    
      ]
    
    }
  3. 在代码中引用自定义的颜色资源值,使用$r加载自定义颜色资源,系统将自动在应用深浅色变化时,加载对应限定词目录下的资源文件,从而改变页面元素的颜色完成深浅色适配。

    TypeScript 复制代码
    @Entry
    
    @Component
    
    struct Card {
    
      build() {
    
        Row() {
    
          Text('hello')
    
            .fontColor($r('app.color.text_color'))
    
        }
    
        .width('100%')
    
        .height('100%')
    
      }
    
    }

2.问题描述:

FormExtensionAbility生命周期中提供了onConfigurationUpdate生命周期回调,该生命周期回调在系统深浅色模式发生变化时是否会触发?

解决方案:

因系统规格设计,当系统配置项变更时,仅系统应用拉活应用服务卡片对应的EntryFormAbility并触发相应的onConfigurationUpdate回调函数。

三方应用仅当FormExtensionAbility存活时才会触发onConfigurationUpdate回调。

3.问题描述:

通过mediaquery.matchMediaSync接口可以设置媒体查询的查询条件,是否可以通过mediaquery.matchMediaSync('(dark-mode: true)')直接在卡片页面注册系统深浅色监听回调?

解决方案:

由于卡片规格限制,虽然该接口支持在ArkTS卡片页面中使用,但是无法监听获取查询结果。

4.问题描述:

是否可以使用PersistentStorage和AppStorage在应用和卡片之间进行状态数据共享?

解决方案:

卡片和应用的主进程不是一个进程,而AppStorage是和进程绑定的,仅支持应用的主线程内多个UIAbility实例间的UI状态数据共享,所以卡片和应用主进程之间无法使用PersistentStorage和AppStorage进行状态数据共享。

5.问题描述:

跨进程经常需要数据共享如服务卡片和其主应用,但在主应用更新首选项数据后,在服务卡片中用取到的值错误的场景。

解决方案:

不同进程的内存不共享,同一进程中getPreferences只有首次会从持久化中取,所以要跨进程读取最新的持久化数据时,需先通过preferences.removePreferencesFromCache接口将Preferences实例移出缓存中的实例之后,再次getPreferences将会重新读取持久化文件,生成新的Preferences实例。

以主应用中更新首选项中的data,在服务卡片中通过首选项取data为例。

在主应用中更新data,并通知服务卡片更新。

kotlin 复制代码
preferences.getPreferences(this.context, 'myPreference', (err: BusinessError, pf: preferences.Preferences) => {

    if (err) {

        console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);

        return;

    }

    pf.put("formData", data);

    pf.flush();

    formProvider.updateForm(curFormId, formMsg);

    console.info("Succeeded in getting preferences.");

})

卡片中收到更新事件如onFormEvent方法回调时,需要先通过removePreferencesFromCache清缓存的Preferences实例再重新取Preferences实例。

csharp 复制代码
async function getCache() {

    await preferences.removePreferencesFromCache(context, 'myPreference');

    const pf = await preferences.getPreferences(context, 'myPreference');

    const data = await pf.get('formData', 'fault');

    console.info("cache data: " + data);

}
相关推荐
Ranger092927 分钟前
鸿蒙开发新范式:Gpui
rust·harmonyos
Huang兄1 小时前
鸿蒙-深色模式适配
harmonyos·arkts·arkui
SummerKaze2 天前
为鸿蒙开发者写一个 nvm:hmvm 的设计与实现
harmonyos
在人间耕耘4 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
王码码20354 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
HarmonyOS_SDK4 天前
【FAQ】HarmonyOS SDK 闭源开放能力 — Ads Kit
harmonyos
Swift社区4 天前
如何利用 ArkUI 框架优化鸿蒙应用的渲染性能
华为·harmonyos
特立独行的猫a4 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
盐焗西兰花4 天前
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
服务器·学习·harmonyos
盐焗西兰花4 天前
鸿蒙学习实战之路-STG系列(4/11)-应用选择页功能详解
服务器·学习·harmonyos