動態

詳情 返回 返回

【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文件中定義頁面元素在淺色模式下的顏色值。

    
    {
    
      "color": [
    
        {
    
          "name": "text_color",
    
          "value": "#000000"
    
        }
    
      ]
    
    }
    
  2. 在src/main/resources/dark/element/color.json文件中定義頁面元素在淺色模式下的顏色值。

    
    {
    
      "color": [
    
        {
    
          "name": "text_color",
    
          "value": "#FFFFFF"
    
        }
    
      ]
    
    }
    
  3. 在代碼中引用自定義的顏色資源值,使用$r加載自定義顏色資源,系統將自動在應用深淺色變化時,加載對應限定詞目錄下的資源文件,從而改變頁面元素的顏色完成深淺色適配。

    
    @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,並通知服務卡片更新。


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實例。


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);

}
user avatar wodekouwei 頭像
點贊 1 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.