0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Harmony 鴻蒙應(yīng)用級(jí)變量的狀態(tài)管理

王程 ? 來(lái)源: jf_75796907 ? 作者: jf_75796907 ? 2024-01-24 21:30 ? 次閱讀

應(yīng)用級(jí)變量的狀態(tài)管理

在前面的章節(jié)中,已經(jīng)講述了如何管理頁(yè)面級(jí)變量的狀態(tài),本章將說(shuō)明如何管理應(yīng)用級(jí)變量的狀態(tài),具體接口說(shuō)明請(qǐng)參考應(yīng)用級(jí)變量的狀態(tài)管理接口。

AppStorage

AppStorage是應(yīng)用程序中的單例對(duì)象,由UI框架在應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建,在應(yīng)用程序退出時(shí)銷毀,為應(yīng)用程序范圍內(nèi)的可變狀態(tài)屬性提供中央存儲(chǔ)。

AppStorage包含整個(gè)應(yīng)用程序中需要訪問(wèn)的所有狀態(tài)屬性,只要應(yīng)用程序保持運(yùn)行,AppStorage就會(huì)保存所有屬性及屬性值,屬性值可以通過(guò)唯一的鍵值進(jìn)行訪問(wèn)。

組件可以通過(guò)裝飾器將應(yīng)用程序狀態(tài)數(shù)據(jù)與AppStorage進(jìn)行同步,應(yīng)用業(yè)務(wù)邏輯的實(shí)現(xiàn)也可以通過(guò)接口訪問(wèn)AppStorage。

AppStorage的選擇狀態(tài)屬性可以與不同的數(shù)據(jù)源或數(shù)據(jù)接收器同步,這些數(shù)據(jù)源和接收器可以是設(shè)備上的本地或遠(yuǎn)程,并具有不同的功能,如數(shù)據(jù)持久性。這樣的數(shù)據(jù)源和接收器可以獨(dú)立于UI在業(yè)務(wù)邏輯中實(shí)現(xiàn)。

默認(rèn)情況下,AppStorage中的屬性是可變的,AppStorage還可使用不可變(只讀)屬性。

說(shuō)明:Worker和主線程只能通過(guò)postMessage交互,不能使用AppStorage進(jìn)行交互。

@StorageLink裝飾器

組件通過(guò)使用@StorageLink(key)裝飾的狀態(tài)變量,與AppStorage建立雙向數(shù)據(jù)綁定,key為AppStorage中的屬性鍵值。當(dāng)創(chuàng)建包含@StorageLink的狀態(tài)變量的組件時(shí),該狀態(tài)變量的值將使用AppStorage中的值進(jìn)行初始化。在UI組件中對(duì)@StorageLink的狀態(tài)變量所做的更改將同步到AppStorage,并從AppStorage同步到任何其他綁定實(shí)例中,如PersistentStorage或其他綁定的UI組件。

@StorageProp裝飾器

組件通過(guò)使用@StorageProp(key)裝飾的狀態(tài)變量,與AppStorage建立單向數(shù)據(jù)綁定,key標(biāo)識(shí)AppStorage中的屬性鍵值。當(dāng)創(chuàng)建包含@StorageProp的狀態(tài)變量的組件時(shí),該狀態(tài)變量的值將使用AppStorage中的值進(jìn)行初始化。AppStorage中屬性值的更改會(huì)導(dǎo)致綁定該狀態(tài)變量的UI組件進(jìn)行狀態(tài)更新。

示例

每次用戶單擊Count按鈕時(shí),this.varA變量值都會(huì)增加1,此變量與AppStorage中的varA同步。每次用戶單擊language按鈕時(shí),修改AppStorage中的languageCode,此修改會(huì)同步給this.languageCode變量。

// xxx.ets
@Entry
@Component
struct ComponentA {
  @StorageLink('varA') varA: number = 2
  @StorageProp('languageCode') languageCode: string = 'en'
  private label: string = 'count'

  aboutToAppear() {
    this.label = (this.languageCode === 'zh') ? '數(shù)量' : 'Count'
  }

  build() {
    Column() {
      Row({ space: 20 }) {
        Button(`${this.label}: ${this.varA}`)
          .onClick(() = > {
            AppStorage.Set< number >('varA', AppStorage.Get< number >('varA') + 1)
          })
        Button(`language: ${this.languageCode}`)
          .onClick(() = > {
            if (AppStorage.Get< string >('languageCode') === 'zh') {
              AppStorage.Set< string >('languageCode', 'en')
            } else {
              AppStorage.Set< string >('languageCode', 'zh')
            }
            this.label = (this.languageCode === 'zh') ? '數(shù)量' : 'Count'
          })
      }
      .margin({ top: 50, bottom: 50 })

      Row() {
        Button(`更改@StorageLink修飾的變量:${this.varA}`).height(40).fontSize(14)
          .onClick(() = > {
            this.varA++
          })
      }
    }.width('100%')
  }
}

LocalStorage

說(shuō)明:
該接口從API version 9開(kāi)始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。

LocalStorage是應(yīng)用程序中的存儲(chǔ)單元,生命周期跟隨其關(guān)聯(lián)的Ability。在Stage模型下,LocalStorage解決AppStorage共享范圍過(guò)大的問(wèn)題,提供Ability之間全局?jǐn)?shù)據(jù)的隔離。同時(shí),LocalStorage為應(yīng)用程序范圍內(nèi)的可變狀態(tài)屬性和非可變狀態(tài)屬性提供存儲(chǔ),可變狀態(tài)屬性和非可變狀態(tài)屬性是構(gòu)建應(yīng)用程序UI的一部分,如一個(gè)Ability的UI。解決App與Ability之間數(shù)據(jù)互相干擾問(wèn)題,多實(shí)例場(chǎng)景下同一個(gè)Ability類的不同Ability實(shí)例之間的數(shù)據(jù)互相干擾問(wèn)題。在分布式遷移的場(chǎng)景下,Ability是系統(tǒng)調(diào)度的最小單元,配合LocalStorage更方便實(shí)現(xiàn)組件的數(shù)據(jù)遷移。

應(yīng)用層:一個(gè)應(yīng)用程序可以創(chuàng)建多個(gè)LocalStorage實(shí)例,應(yīng)用程序的每一個(gè)Ability對(duì)應(yīng)一個(gè)LocalStorage實(shí)例。

Ability:一個(gè)應(yīng)用程序可以擁有多個(gè)Ability,一個(gè)Ability中的所有子組件最多可以分配一個(gè)LocalStorage實(shí)例。并且,Ability中的所有子組件都將繼承對(duì)此LocalStorage實(shí)例存儲(chǔ)對(duì)象的訪問(wèn)權(quán)。

一個(gè)組件最多可以訪問(wèn)一個(gè)LocalStorage實(shí)例,一個(gè)LocalStorage對(duì)象可以分配給多個(gè)組件。

@LocalStorageLink裝飾器

組件通過(guò)使用@LocalStorageLink(key)裝飾的狀態(tài)變量,key值為L(zhǎng)ocalStorage中的屬性鍵值,與LocalStorage建立雙向數(shù)據(jù)綁定。當(dāng)創(chuàng)建包含@LocalStorageLink的狀態(tài)變量的組件時(shí),該狀態(tài)變量的值將會(huì)使用LocalStorage中的值進(jìn)行初始化。如果LocalStorage中未定義初始值,將使用@LocalStorageLink定義的初始值。在UI組件中對(duì)@LocalStorageLink的狀態(tài)變量所做的更改將同步到LocalStorage中,并從LocalStorage同步到Ability下的組件中。

@LocalStorageProp裝飾器

組件通過(guò)使用LocalStorageProp(key)裝飾的狀態(tài)變量,key值為L(zhǎng)ocalStorage中的屬性鍵值,與LocalStorage建立單向數(shù)據(jù)綁定。當(dāng)創(chuàng)建包含@LocalStorageProp的狀態(tài)變量的組件時(shí),該狀態(tài)變量的值將使用LocalStorage中的值進(jìn)行初始化。LocalStorage中的屬性值的更改會(huì)導(dǎo)致當(dāng)前Ability下的所有UI組件進(jìn)行狀態(tài)更新。

說(shuō)明:創(chuàng)建LocalStorage實(shí)例時(shí)如未定義初始值,可以使用組件內(nèi)@LocalStorageLink和@LocalStorageProp的初始值。如果定義時(shí)給定了初始值,那么不會(huì)再使用@LocalStorageLink和@LocalStorageProp的初始值。

示例1(在一個(gè)Ability中創(chuàng)建LocalStorage)

LocalStorage通過(guò)loadContent接口加載

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    storage: LocalStorage

    onCreate() {
        this.storage = new LocalStorage()
        this.storage.setOrCreate('storageSimpleProp', 121)
        console.info('[Demo EntryAbility onCreate]')
    }

    onDestroy() {
        console.info('[Demo EntryAbility onDestroy]')
    }

    onWindowStageCreate(windowStage) {
        // storage作為參數(shù)傳遞給loadContent接口
        windowStage.loadContent('pages/Index', this.storage)
    }

    onWindowStageDestroy() {
        console.info('[Demo] EntryAbility onWindowStageDestroy')
    }

    onForeground() {
        console.info('[Demo] EntryAbility onForeground')
    }

    onBackground() {
        console.info('[Demo] EntryAbility onBackground')
    }
}

@Component組件獲取數(shù)據(jù)

// Index.ets
let storage = LocalStorage.GetShared()

@Entry(storage)
@Component
struct LocalStorageComponent {
  @LocalStorageLink('storageSimpleProp') simpleVarName: number = 0

  build() {
    Column() {
      Button(`LocalStorageLink: ${this.simpleVarName.toString()}`)
        .margin(20)
        .onClick(() = > {
          this.simpleVarName += 1
        })
      Text(JSON.stringify(this.simpleVarName))
        .fontSize(50)
      LocalStorageComponentProp()
    }.width('100%')
  }
}

@Component
struct LocalStorageComponentProp {
  @LocalStorageProp('storageSimpleProp') simpleVarName: number = 0

  build() {
    Column() {
      Button(`LocalStorageProp: ${this.simpleVarName.toString()}`)
        .margin(20)
        .onClick(() = > {
          this.simpleVarName += 1
        })
      Text(JSON.stringify(this.simpleVarName))
        .fontSize(50)
    }.width('100%')
  }
}

示例2(在Entry頁(yè)面定義LocalStorage)

// xxx.ets
let storage = new LocalStorage({ "PropA": 47 })

@Entry(storage)
@Component
struct ComA {
  @LocalStorageLink("PropA") storageLink: number = 1

  build() {
    Column() {
      Text(`Parent from LocalStorage ${this.storageLink}`)
        .fontSize(18)
        .margin(20)
        .onClick(() = > this.storageLink += 1)
      Child()
    }
  }
}

@Component
struct Child {
  @LocalStorageLink("PropA") storageLink: number = 1

  build() {
    Text(`Child from LocalStorage ${this.storageLink}`)
      .fontSize(18)
      .margin(20)
      .onClick(() = > this.storageLink += 1)
  }
}

PersistentStorage

PersistentStorage提供了一些靜態(tài)方法用來(lái)管理應(yīng)用持久化數(shù)據(jù),可以將特定標(biāo)記的持久化數(shù)據(jù)鏈接到AppStorage中,并由AppStorage接口訪問(wèn)對(duì)應(yīng)持久化數(shù)據(jù),或者通過(guò)@StorageLink裝飾器來(lái)訪問(wèn)對(duì)應(yīng)key的變量。

說(shuō)明:

  • PersistentStorage的PersistProp接口使用時(shí),需要保證輸入對(duì)應(yīng)的key在AppStorage中存在。
  • PersistentStorage的DeleteProp接口使用時(shí),只能對(duì)本次應(yīng)用啟動(dòng)時(shí)已經(jīng)link過(guò)的數(shù)據(jù)生效。
// xxx.ets
PersistentStorage.PersistProp('highScore', '0')

@Entry
@Component
struct PersistentComponent {
  @StorageLink('highScore') highScore: string = '0'
  @State currentScore: number = 0

  build() {
    Column() {
      if (this.currentScore === Number(this.highScore)) {
        Text(`new highScore : ${this.highScore}`).fontSize(18)
      }
      Button(`goal!, currentScore : ${this.currentScore}`)
        .margin(20)
        .onClick(() = > {
          this.currentScore++
          if (this.currentScore > Number(this.highScore)) {
            this.highScore = this.currentScore.toString()
          }
        })
    }.width('100%')
  }
}

Environment

Environment是框架在應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建的單例對(duì)象,它為AppStorage提供了一系列應(yīng)用程序需要的環(huán)境狀態(tài)數(shù)據(jù),這些數(shù)據(jù)描述了應(yīng)用程序運(yùn)行的設(shè)備環(huán)境,包括系統(tǒng)語(yǔ)言、深淺色模式等等。Environment及其屬性是不可變的,所有數(shù)據(jù)類型均為簡(jiǎn)單類型。如下示例展示了從Environment獲取系統(tǒng)是否開(kāi)啟無(wú)障礙屏幕朗讀:

Environment.EnvProp('accessibilityEnabled', 'default')
var enable = AppStorage.Get('accessibilityEnabled')

accessibilityEnabled是Environment提供的系統(tǒng)默認(rèn)變量識(shí)別符。首先需要將對(duì)應(yīng)系統(tǒng)屬性綁定到AppStorage上,再通過(guò)AppStorage中的方法或者裝飾器訪問(wèn)對(duì)應(yīng)的系統(tǒng)屬性數(shù)據(jù)。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28369
  • Harmony
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    2609
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenHarmony頁(yè)面級(jí)變量狀態(tài)管理

    @State、@Prop、@Link、@Provide、Consume、@ObjectLink、@Observed和@Watch用于管理頁(yè)面級(jí)變量狀態(tài)。
    的頭像 發(fā)表于 12-07 08:58 ?2690次閱讀

    鴻蒙開(kāi)發(fā)教程-管理組件狀態(tài)

    跨組件層級(jí)雙向同步狀態(tài)是指@Provide修飾的狀態(tài)變量自動(dòng)對(duì)提供者組件的所有后代組件可用,后代組件通過(guò)使用@Consume裝飾的變量來(lái)獲得對(duì)提供的狀態(tài)變量的訪問(wèn)。
    的頭像 發(fā)表于 01-22 21:46 ?1338次閱讀
    <b class='flag-5'>鴻蒙</b>開(kāi)發(fā)教程-<b class='flag-5'>管理</b>組件<b class='flag-5'>狀態(tài)</b>

    Harmony 鴻蒙頁(yè)面級(jí)變量狀態(tài)管理

    頁(yè)面級(jí)變量狀態(tài)管理 @State、@Prop、@Link、@Provide、@Consume、@ObjectLink、@Observed和@Watch用于
    發(fā)表于 01-24 20:04

    Harmony如何管理網(wǎng)頁(yè)

    你好,我可能錯(cuò)過(guò)了一些東西,但我找不到關(guān)于Harmony如何管理網(wǎng)頁(yè)(使用文件系統(tǒng))以生成HTTP服務(wù)器中使用的c代碼的答案。我使用BSP和相關(guān)的評(píng)估板(PIC32MZ EC)啟動(dòng)了一個(gè)項(xiàng)目。當(dāng)生成
    發(fā)表于 07-30 12:25

    跟阿斌一起學(xué)鴻蒙(4). 分布式Hello Harmony的N種寫(xiě)法

    鴻蒙OS是一個(gè)分布式操作系統(tǒng),而Ability作為它調(diào)度的基本單元,那么,一個(gè)分布式Hello Harmony可以有幾種寫(xiě)法呢?# 分布式Hello Harmony用例## 1. 根據(jù)Ability
    發(fā)表于 12-07 14:36

    跟阿斌一起學(xué)鴻蒙(4). 分布式Hello Harmony的N種寫(xiě)法

    轉(zhuǎn)自:https://harmonyos.51cto.com/posts/1984鴻蒙OS是一個(gè)分布式操作系統(tǒng),而Ability作為它調(diào)度的基本單元,那么,一個(gè)分布式Hello Harmony可以有
    發(fā)表于 12-10 10:52

    跟阿斌一起學(xué)鴻蒙(4). 分布式Hello Harmony的N種寫(xiě)法

    鴻蒙OS是一個(gè)分布式操作系統(tǒng),而Ability作為它調(diào)度的基本單元,那么,一個(gè)分布式Hello Harmony可以有幾種寫(xiě)法呢?# 分布式Hello Harmony用例## 1. 根據(jù)Ability
    發(fā)表于 12-10 14:59

    如何設(shè)置鴻蒙harmony控件的高度是屏幕的一半?

    鴻蒙harmony想讓控件的高度是屏幕的一半,該如何設(shè)置?在XML和java代碼中,分別該如何設(shè)置?
    發(fā)表于 03-23 11:09

    華為鴻蒙Harmony使用WIFI/IP連接調(diào)試的步驟有哪些呢

    華為鴻蒙Harmony使用WIFI/IP連接調(diào)試1、先打開(kāi)SDK所在目錄,例如:D:\HarmonyOS\Sdk\toolchains,然后打開(kāi)powershell,如下圖2、輸入一下命令
    發(fā)表于 05-24 15:20

    OpenHarmony應(yīng)用ArkUI 狀態(tài)管理開(kāi)發(fā)范例

    稱為狀態(tài)管理機(jī)制。 自定義組件擁有變量,變量必須被裝飾器裝飾才可以成為狀態(tài)變量狀態(tài)變量的改變會(huì)
    發(fā)表于 09-01 15:03

    動(dòng)態(tài)電路的狀態(tài)變量分析

    動(dòng)態(tài)電路的狀態(tài)變量分析􀂄 7.1 電路的狀態(tài)狀態(tài)變量􀂄 7.2 狀態(tài)方程及其列寫(xiě)􀂄 7.3
    發(fā)表于 12-04 18:01 ?0次下載
    動(dòng)態(tài)電路的<b class='flag-5'>狀態(tài)變量</b>分析

    狀態(tài)變量濾波器,狀態(tài)變量濾波器原理是什么?

    狀態(tài)變量濾波器,狀態(tài)變量濾波器原理是什么? 狀態(tài)變量濾波器,又稱多態(tài)變量濾波器,它可以分別從不同的點(diǎn)同時(shí)輸出高通、帶通、低通等,且
    發(fā)表于 03-24 14:24 ?6633次閱讀

    滴滴出行將支持Harmony OS2.0,余承東還宣布鴻蒙的開(kāi)源路標(biāo)

    據(jù)爆料,滴滴出行支持 Harmony OS2.0,并且鴻蒙手表里也支持滴滴 APP,用手表就能打車。
    的頭像 發(fā)表于 09-22 12:45 ?2113次閱讀

    華為p40升級(jí)鴻蒙系統(tǒng)步驟教程

    華為鴻蒙(英語(yǔ):Harmony OS,開(kāi)發(fā)代號(hào):Ark)是基于微內(nèi)核的全場(chǎng)景分布式OS。
    的頭像 發(fā)表于 07-06 11:24 ?5990次閱讀

    Harmony 鴻蒙頁(yè)面級(jí)變量狀態(tài)管理

    頁(yè)面級(jí)變量狀態(tài)管理 @State、@Prop、@Link、@Provide、@Consume、@ObjectLink、@Observed和@Watch用于
    的頭像 發(fā)表于 01-25 10:42 ?596次閱讀
    <b class='flag-5'>Harmony</b> <b class='flag-5'>鴻蒙</b>頁(yè)面<b class='flag-5'>級(jí)</b><b class='flag-5'>變量</b>的<b class='flag-5'>狀態(tài)</b><b class='flag-5'>管理</b>