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

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

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

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

王程 ? 來源: jf_75796907 ? 作者: jf_75796907 ? 2024-01-24 21:30 ? 次閱讀

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

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

AppStorage

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

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

組件可以通過裝飾器將應(yīng)用程序狀態(tài)數(shù)據(jù)與AppStorage進(jìn)行同步,應(yīng)用業(yè)務(wù)邏輯的實(shí)現(xià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還可使用不可變(只讀)屬性。

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

@StorageLink裝飾器

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

@StorageProp裝飾器

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

示例

每次用戶單擊Count按鈕時,this.varA變量值都會增加1,此變量與AppStorage中的varA同步。每次用戶單擊language按鈕時,修改AppStorage中的languageCode,此修改會同步給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

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

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

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

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

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

@LocalStorageLink裝飾器

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

@LocalStorageProp裝飾器

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

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

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

LocalStorage通過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頁面定義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)方法用來管理應(yīng)用持久化數(shù)據(jù),可以將特定標(biāo)記的持久化數(shù)據(jù)鏈接到AppStorage中,并由AppStorage接口訪問對應(yīng)持久化數(shù)據(jù),或者通過@StorageLink裝飾器來訪問對應(yīng)key的變量。

說明:

  • PersistentStorage的PersistProp接口使用時,需要保證輸入對應(yīng)的key在AppStorage中存在。
  • PersistentStorage的DeleteProp接口使用時,只能對本次應(yīng)用啟動時已經(jīng)link過的數(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)用程序啟動時創(chuàng)建的單例對象,它為AppStorage提供了一系列應(yīng)用程序需要的環(huán)境狀態(tài)數(shù)據(jù),這些數(shù)據(jù)描述了應(yīng)用程序運(yùn)行的設(shè)備環(huán)境,包括系統(tǒng)語言、深淺色模式等等。Environment及其屬性是不可變的,所有數(shù)據(jù)類型均為簡單類型。如下示例展示了從Environment獲取系統(tǒng)是否開啟無障礙屏幕朗讀:

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

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

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    613

    瀏覽量

    28306
  • Harmony
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    2579
收藏 人收藏

    評論

    相關(guān)推薦

    OpenHarmony頁面變量狀態(tài)管理

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

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

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

    Harmony 鴻蒙頁面變量狀態(tài)管理

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

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

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

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

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

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

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

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

    鴻蒙OS是一個分布式操作系統(tǒng),而Ability作為它調(diào)度的基本單元,那么,一個分布式Hello Harmony可以有幾種寫法呢?# 分布式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、先打開SDK所在目錄,例如:D:\HarmonyOS\Sdk\toolchains,然后打開powershell,如下圖2、輸入一下命令
    發(fā)表于 05-24 15:20

    鴻蒙 OS 應(yīng)用開發(fā)初體驗(yàn)

    kotlin 語言了,編程語言變成了類 JavaScript 的前端語言,這意味著我們需要適應(yīng)用前端的思想去開發(fā)鴻蒙應(yīng)用,比如狀態(tài)管理。 總結(jié) 本文純初體驗(yàn)遙遙領(lǐng)先背后的鴻蒙操作系統(tǒng)
    發(fā)表于 11-02 19:38

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

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

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

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

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

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

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

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

    Harmony 鴻蒙頁面變量狀態(tài)管理

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