吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【開發者說】HarmonyOS實踐之應用狀態變量共享

HarmonyOS開發者 ? 來源:未知 ? 2023-12-26 21:20 ? 次閱讀
# 開發者說 #

【開發者說】欄目是為HarmonyOS開發者提供的展示和分享平臺,在這里,大家可以發表自己的技術洞察和見解,也可以展示自己的開發心得和成果。

歡迎大家積極投稿,后臺回復【投稿】,即可獲得投稿渠道。期待你們的分享~

平時在開發的過程中,我們會在應用中共享數據,在不同的頁面間共享信息。雖然常用的共享信息,也可以通過不同頁面中組件間信息共享的方式,但有時使用應用級別的狀態管理會讓開發工作變得簡單。

根據不同的使用場景,ArkTS提供了以下幾種應用狀態管理的能力:

  • LocalStorage:使用范圍在同一頁面,頁面與卡片和頁面與UIAbility內部,負責UI狀態存儲。

  • AppStorage:運行時存儲,保存在內存中,應用范圍全局共享,提供統一的存儲供所有頁面訪問。

  • PersistentStorage:持久化存儲,保存在硬盤上,在應用退出或重啟后,數據依舊保留。

下面通過簡單的程序示例,熟悉一下這三種用法。其中示例程序中包含了以下主要文件:

wKgaomWK1C6APAa9AAAqPUjy7vc591.png

LocalStorage

頁面級的UI狀態存儲,同一個頁面共享同一個LocalStorage,不同的頁面都可以綁定對應的LocalStorage。最常用的就是更新服務卡片和跨頁面的信息傳遞。

場景一:更新服務卡片

服務卡片中被@Entry裝飾的@Component,可以被分配一個LocalStorage實例,在組件內部,通過@LocalStorageProp裝飾器定義本地變量,并綁定到對應組件上。更新卡片時,先定義一個包含了和LocalStorageProp屬性同名的參數并放到formBindingData中,然后通過formProvider.updateForm函數,就可以更新服務卡片了。

我們要在EntryFormAbility.ets中通過傳遞LocalStorage改變服務卡片中的默認Hello的文本標簽為當前時間。

實踐步驟:

1.修改服務卡片布局文件,文件開頭添加:

let storage = new LocalStorage();

并為Entry增加參數storage。

例如,WidgetCard.ets,默認:

@Entry
@Component
struct WidgetCard {
...

改之后:

let storage = new LocalStorage();
@Entry(storage)
@Component
struct WidgetCard {
...

2.在EntryFormAbility.ets中,用裝飾器LocalStorageProp定義本地變量,裝飾器的參數必須要和formBindingData中的屬性名稱相同。

例如,在接收方服務卡片中定義如下:

@LocalStorageProp('localprop') localValue: string = 'Hello';

(左右滑動查看更多)

wKgaomWK1C6AJ3KoAABks3rrSSg990.png

卡片標簽默認顯示了Hello。

在發送方EntryFormAbility.ts文件的onFormEvent函數里:

onFormEvent(formId, message) {
  let date = new Date();
  let str = date.getHours().toString().padStart(2, '0') + ':' +  date.getMinutes().toString().padStart(2, '0') + ':' + date.getSeconds().toString().padStart(2, '0')
  let formData = {
    'localprop': 'Time: ' + str,
  };
  let formInfo = formBindingData.createFormBindingData(formData)
  formProvider.updateForm(formId, formInfo).then((data) => {
    console.info('FormAbility updateForm success.' + JSON.stringify(data));
  }).catch((error) => {
    console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
  })
}

(左右滑動查看更多)

formData對象里包含了名稱為localprop的鍵值,它通過formBindingData由formProvider傳遞給服務卡片,服務卡片接收到該對象后,就自動把該對象賦值給LocalStorage,相應的LocalStorageProp也自動跟著刷新。

這個動作是通過點擊卡片上的update按鈕,觸發了postCardAction事件從而調用了onFormEvent函數,執行結果如下:

wKgaomWK1C6AZG9fAABxWwxCj9w604.png

場景二:跨頁面的信息傳遞

在頁面初次加載時,可以在EntryAbility.ts中傳遞一個LocalStorage對象給要打開的頁面。

我們打算在index.ets頁面加載的時候,在EntryAbility中傳遞一個包含abilitycount值為1的Storage,頁面加載后界面顯示該值。

實踐步驟:

1.在EntryAbility.ts中定義一個LocalStorage類型的變量,里面包含abilitycount屬性。

export default class EntryAbility extends UIAbility {
  storage: LocalStorage = new LocalStorage({
    'abilitycount': 1
});

(左右滑動查看更多)

在onWindowStageCreate函數中,將默認的:

windowStage.loadContent('pages/Index', (err, data) => {

(左右滑動查看更多)

改為傳遞參數的方式,如下:

windowStage.loadContent('pages/Index', this.storage);

(左右滑動查看更多)

2.在頁面端Index.ets中,文件開頭添加代碼來獲取共享的LocalStorage。

let storage = LocalStorage.GetShared()

(左右滑動查看更多)

在結構體內部,通過裝飾器LocalStorageProp加同樣屬性名稱作為參數,定義一個變量。

@LocalStorageProp('abilitycount') abilityCount: number = 0;

(左右滑動查看更多)

這樣名為abilitycount的值就通過LocalStorage傳遞到頁面了,本地默認的值0變為了傳遞過來的值1。

下圖中LocalStorage的值就是頁面打開時顯示的傳遞過來的值。

wKgaomWK1C6AS1jmAABmvakR39w885.png

AppStorage

全局的UI狀態存儲,在運行時階段可以在不同的頁面間共享信息。

我們通過在Index.ets頁面創建一個變量放到AppStorage中,然后分別在First.ets頁面和Second.ets頁面訪問和修改。

實踐步驟:

1.首先在Index.ets中,通過AppStorage定義一個屬性。

AppStorage.SetOrCreate('appcount', 10);

(左右滑動查看更多)

然后,在組件結構體中使用StorageProp裝飾器定義一個變量,參數為之前定義的appcount屬性。

@Entry()
@Component
struct Index {


@StorageProp('appcount')appValue:number=0;

(左右滑動查看更多)

2.在First.ets頁面中,通過StorageProp定義一個appValue變量,關聯到appcount屬性上。

struct First {
@StorageProp('appcount')appValue:number=0;

(左右滑動查看更多)

在本地修改時,把用戶輸入的值寫入AppStorage,使用如下語句:

AppStorage.Set('appcount', this.textApp);

(左右滑動查看更多)

Second.ets頁面與First.ets頁面功能完全相同,主要顯示AppStorage在不同頁面顯示和修改的效果。

如下圖,主頁面、第一個頁面和第二個頁面初始狀態下,讀取到的AppStorage中的同一個屬性的值都是10。

wKgaomWK1C-AJFezAAFeUGhxXHg546.png

在第一個頁面First.ets中把AppStorage中的屬性值改為11,我們發現在主頁面Index.ets和Second.ets中,對應的屬性值都發生了變化。

wKgaomWK1C-AcV89AAFSIyt6gV8562.png

同樣,在第二個頁面Second.ets中把AppStorage中的屬性值改為12,我們發現在Index.ets和First.ets中,對應的屬性值也都變為了改后的值。

wKgaomWK1C-AAGj7AAFSnN8K34c249.png

如上測試,我們發現的確可以通過AppStorage在不同頁面間共享數據。

PersistentStorage

持久化存儲UI狀態。保存在PersistentStorage中的數據,即使應用退出了,對應的值依然會保留,不是在內存中,而是存儲在固定存儲介質上的。

我們通過在Index.ets頁面創建一個屬性放到PersistentStorage中,然后分別在First.ets頁面和Second.ets頁面進行修改,然后再重啟應用觀察結果。

實踐步驟:

1.首先在Index.ets中,在PersistentStorage里定義一個屬性。

PersistentStorage.PersistProp('persistentcount', 100);

(左右滑動查看更多)

然后在組件結構體中,通過裝飾器StorageProp定義一個屬性為persistentcount的變量。

@Entry()
@Component
struct Index {
@StorageProp('persistentcount')persistentValue:number=0;

(左右滑動查看更多)

2.在First.ets頁面中,我們通過裝飾器StorageProp定義一個變量綁定persistentcount屬性。

@Entry
@Component
structFirst{
@StorageProp('persistentcount')persistentValue:number=0;

(左右滑動查看更多)

通過輸入框輸入新值改變原來存儲在PersistentStorage的內容。

AppStorage.Set('persistentcount', this.textPersistent);

(左右滑動查看更多)

演示效果如下圖,Index.ets頁面,在初始時AppStorage和PersistentStorage中的對應屬性值分別是10和100,在First.ets頁面中,我們分別改為11和111。

wKgaomWK1C-AdnKLAADnuQWNcXQ857.png

關閉應用,然后重新打開,如下圖所示,AppStorage中的屬性值恢復為了10,PersistentStorage中的屬性值依舊是111,是改后的值。這證明了PersistentStorage有持續化存儲的作用。

wKgaomWK1C-AOHllAACPVtpknEI178.png

總結

通過這次實踐,熟悉了不同的狀態變量在應用中的不同應用范圍,選用合適的狀態變量會讓應用開發簡單快捷,本地頁面內部使用LocalStorage保存數據,應用頁面間通過AppStorage傳遞信息,PersistentStorage可以持久化存儲數據信息。

更多推薦


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30577

原文標題:【開發者說】HarmonyOS實踐之應用狀態變量共享

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    微軟發布《GraphRAG實踐應用白皮書》助力開發者

    近日,微軟針對開發者群體,重磅推出了《GraphRAG實踐應用白皮書》。該白皮書全面而深入地涵蓋了知識圖譜的核心內容,為開發者和企業提供了寶貴的指導和啟示。 從知識圖譜的基礎概念出發,白皮書詳細闡述
    的頭像 發表于 01-13 16:11 ?365次閱讀

    HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發

    注重理論與實踐的結合,提供讓開發者快速上手的codelab編程練習,開發者能在實戰中鞏固所學,系統掌握核心開發技能。完成課程后,開發者可參加
    發表于 01-02 14:24

    HarmonyOS開發指導類文檔更新速遞(下)

    伴隨著HarmonyOS 5.0.0 Release、HarmonyOS 5.0.1 Release版本的發布,HarmonyOS官網文檔也帶來了不少上新內容。本期HarmonyOS
    的頭像 發表于 12-30 09:54 ?233次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>指導類文檔更新速遞(下)

    HarmonyOS開發寶典震撼來襲,卓越應用開發之旅一觸即發,輕松啟程!

    HarmonyOS賦能產品,全面護航開發者HarmonyOS感知、學習進階、開發實踐至技術支持的全旅程,助力
    發表于 12-05 08:57

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)習慣推薦方案開發者測試

    意圖框架向開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-25 17:37

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)習慣推薦方案概述

    一、習慣推薦是HarmonyOS學習用戶的行為習慣后做出的主動預測推薦。 1.開發者將用戶在應用/元服務內的使用行為向HarmonyOS共享,使得H
    發表于 11-19 17:59

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)事件推薦開發者測試

    意圖框架向開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-18 17:39

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)本地搜索方案概述

    一、概述 本地搜索是在HarmonyOS歸一化搜索特性,開發者將應用/元服務內的功能和內容通過意圖框架共享HarmonyOS,即可實現“一步搜索,內容直達”。 二、典型場景 以“音樂
    發表于 11-06 10:59

    開發者空間實踐指導:基于 3 大 PaaS 主流服務輕松實現文字轉換語音

    ,對華為云產品 API 體系及 API 開放能力有全面了解,并最終完成應用創建,全程實踐約 15 分鐘。 配置開發者空間 華為云為全球開發者打造專屬
    的頭像 發表于 09-13 16:25 ?510次閱讀
    <b class='flag-5'>開發者</b>空間<b class='flag-5'>實踐</b>指導:基于 3 大 PaaS 主流服務輕松實現文字轉換語音

    軟通動力出席華為開發者大會2024

    6月22日,華為開發者大會2024進入第二天日程。軟通動力舉辦“云云協同,以新質動力驅動智能化躍進”分論壇,邀請華為、合作伙伴、技術專家、學者以及企業代表,聚焦HarmonyOS NEXT、盤古
    的頭像 發表于 06-24 09:34 ?734次閱讀

    潤和軟件HopeOS閃耀亮相鯤鵬昇騰開發者大會2024

    5月9日,鯤鵬昇騰開發者大會2024在北京盛大召開。本次大會是面向開發者的技術盛會,分享計算產業趨勢、前沿AI技術、行業創新案例、優秀開發者實踐等,使能
    的頭像 發表于 05-11 09:52 ?573次閱讀
    潤和軟件HopeOS閃耀亮相鯤鵬昇騰<b class='flag-5'>開發者</b>大會2024

    HarmonyOS NEXT應用開發性能優化入門引導

    : this.translateObj.translateX }) } } 控制對象級狀態變量成員數量 應該控制對象級狀態變量的成員變量關聯的組件數量。開發者封裝一個數據結構類用于
    發表于 05-09 14:49

    harmonyos開發者平臺

    使用@State、@Prop、@Link、@Watch、@Provide、@Consume管理頁面級變量狀態,實現對頁面數據的增加、刪除、修改。
    的頭像 發表于 05-06 16:02 ?908次閱讀
    <b class='flag-5'>harmonyos</b><b class='flag-5'>開發者</b>平臺

    鴻蒙OS開發實例:【應用狀態變量共享

    平時在開發的過程中,我們會在應用中共享數據,在不同的頁面間共享信息。雖然常用的共享信息,也可以通過不同頁面中組件間信息共享的方式,但有時使用
    的頭像 發表于 04-03 15:09 ?1449次閱讀
    鴻蒙OS<b class='flag-5'>開發</b>實例:【應用<b class='flag-5'>狀態變量</b><b class='flag-5'>共享</b>】

    鴻蒙開發者預覽版如何?

    在24年的華為鴻蒙發布會中表示。預覽版已經向開發者開放申請,首批支持的機型有三款分別為華為 Mate 60、華為Mate 60 Pro、華為Mate X5。 其HarmonyOS NEXT去除
    發表于 02-17 21:54
    百家乐赌博机玩法| 桂林市| 香港百家乐官网的玩法技巧和规则| 金彩百家乐的玩法技巧和规则| 百家乐官网怎么推算| 民宅24方位| 168棋牌游戏| 大家旺百家乐官网的玩法技巧和规则| 威尼斯人娱乐城信誉怎样| 百家乐官网三珠投注法| 百家乐tt娱乐场开户注册| 百家乐官网三号的赢法| 百家乐无损打法| 百家乐官网游戏怎么刷钱| 百家乐赌博代理合作| 赌百家乐官网赢的奥妙| 送彩金百家乐平台| 百家乐官网软件购买| 百家乐职业赌徒的解密| 百家乐官网纯数字玩法| 鼠和猴做生意招财| 在线赌博平台| 视频百家乐游戏| 百家乐官网是如何骗人的| 新澳门百家乐的玩法技巧和规则| 现金百家乐官网赢钱| 百家乐那里信誉好| 先锋百家乐官网的玩法技巧和规则 | 辛集市| 利都百家乐国际娱乐| 百家乐官网扑克片礼服| 大发888娱乐日博备用| 手机百家乐官网能兑换现金棋牌游戏 | 澳门百家乐官网鸿福厅| 百家乐视频台球下载| 真人百家乐官网作假视频| 全讯网纯净版| 做生意看风水| 爱拼百家乐官网现金网| 威尼斯人娱乐网| 百家乐官网套利|