精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Harmony 鴻蒙應用級變量的狀態管理

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

應用級變量的狀態管理

在前面的章節中,已經講述了如何管理頁面級變量的狀態,本章將說明如何管理應用級變量的狀態,具體接口說明請參考應用級變量的狀態管理接口。

AppStorage

AppStorage是應用程序中的單例對象,由UI框架在應用程序啟動時創建,在應用程序退出時銷毀,為應用程序范圍內的可變狀態屬性提供中央存儲。

AppStorage包含整個應用程序中需要訪問的所有狀態屬性,只要應用程序保持運行,AppStorage就會保存所有屬性及屬性值,屬性值可以通過唯一的鍵值進行訪問。

組件可以通過裝飾器將應用程序狀態數據與AppStorage進行同步,應用業務邏輯的實現也可以通過接口訪問AppStorage。

AppStorage的選擇狀態屬性可以與不同的數據源或數據接收器同步,這些數據源和接收器可以是設備上的本地或遠程,并具有不同的功能,如數據持久性。這樣的數據源和接收器可以獨立于UI在業務邏輯中實現。

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

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

@StorageLink裝飾器

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

@StorageProp裝飾器

組件通過使用@StorageProp(key)裝飾的狀態變量,與AppStorage建立單向數據綁定,key標識AppStorage中的屬性鍵值。當創建包含@StorageProp的狀態變量的組件時,該狀態變量的值將使用AppStorage中的值進行初始化。AppStorage中屬性值的更改會導致綁定該狀態變量的UI組件進行狀態更新。

示例

每次用戶單擊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') ? '數量' : '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') ? '數量' : 'Count'
          })
      }
      .margin({ top: 50, bottom: 50 })

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

LocalStorage

說明:
該接口從API version 9開始支持。后續版本如有新增內容,則采用上角標單獨標記該內容的起始版本。

LocalStorage是應用程序中的存儲單元,生命周期跟隨其關聯的Ability。在Stage模型下,LocalStorage解決AppStorage共享范圍過大的問題,提供Ability之間全局數據的隔離。同時,LocalStorage為應用程序范圍內的可變狀態屬性和非可變狀態屬性提供存儲,可變狀態屬性和非可變狀態屬性是構建應用程序UI的一部分,如一個Ability的UI。解決App與Ability之間數據互相干擾問題,多實例場景下同一個Ability類的不同Ability實例之間的數據互相干擾問題。在分布式遷移的場景下,Ability是系統調度的最小單元,配合LocalStorage更方便實現組件的數據遷移。

應用層:一個應用程序可以創建多個LocalStorage實例,應用程序的每一個Ability對應一個LocalStorage實例。

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

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

@LocalStorageLink裝飾器

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

@LocalStorageProp裝飾器

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

說明:創建LocalStorage實例時如未定義初始值,可以使用組件內@LocalStorageLink和@LocalStorageProp的初始值。如果定義時給定了初始值,那么不會再使用@LocalStorageLink和@LocalStorageProp的初始值。

示例1(在一個Ability中創建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作為參數傳遞給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組件獲取數據

// 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提供了一些靜態方法用來管理應用持久化數據,可以將特定標記的持久化數據鏈接到AppStorage中,并由AppStorage接口訪問對應持久化數據,或者通過@StorageLink裝飾器來訪問對應key的變量。

說明:

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

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

accessibilityEnabled是Environment提供的系統默認變量識別符。首先需要將對應系統屬性綁定到AppStorage上,再通過AppStorage中的方法或者裝飾器訪問對應的系統屬性數據。

審核編輯 黃宇

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

    關注

    0

    文章

    607

    瀏覽量

    28257
  • Harmony
    +關注

    關注

    0

    文章

    51

    瀏覽量

    2556
收藏 人收藏

    評論

    相關推薦

    OpenHarmony頁面變量狀態管理

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

    鴻蒙開發教程-管理組件狀態

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

    Harmony 鴻蒙頁面變量狀態管理

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

    Harmony如何管理網頁

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

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

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

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

    轉自:https://harmonyos.51cto.com/posts/1984鴻蒙OS是一個分布式操作系統,而Ability作為它調度的基本單元,那么,一個分布式Hello Harmony可以有
    發表于 12-10 10:52

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

    鴻蒙OS是一個分布式操作系統,而Ability作為它調度的基本單元,那么,一個分布式Hello Harmony可以有幾種寫法呢?# 分布式Hello Harmony用例## 1. 根據Ability
    發表于 12-10 14:59

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

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

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

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

    鴻蒙 OS 應用開發初體驗

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

    動態電路的狀態變量分析

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

    狀態變量濾波器,狀態變量濾波器原理是什么?

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

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

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

    華為p40升鴻蒙系統步驟教程

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

    Harmony 鴻蒙頁面變量狀態管理

    頁面變量狀態管理 @State、@Prop、@Link、@Provide、@Consume、@ObjectLink、@Observed和@Watch用于
    的頭像 發表于 01-25 10:42 ?452次閱讀
    <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'>狀態</b><b class='flag-5'>管理</b>