鸿蒙Harmony应用开发—ArkTS-应用级变量的状态管理

news2024/10/1 1:16:53

状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态。

说明:

本模块首批接口从API version 7开始支持,后续版本的新增接口,采用上角标单独标记接口的起始版本。

本文中T和S的含义如下:

类型描述
TClass,number,boolean,string和这些类型的数组形式。
Snumber,boolean,string。

AppStorage

AppStorage具体UI使用说明,详见AppStorage(应用全局的UI状态存储)

link10+

static link(propName: string): SubscribedAbstractProperty

与AppStorage中对应的propName建立双向数据绑定。如果给定的propName在AppStorage中存在,返回与AppStorage中propName对应属性的双向绑定数据。

双向绑定数据的修改会同步回AppStorage中,AppStorage会将变化同步到所有绑定该propName的数据和自定义组件中。

如果AppStorage中不存在propName,则返回undefined。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。

返回值:

类型描述
SubscribedAbstractProperty<T>返回双向绑定的数据,如果AppStorage不存在对应的propName,则返回undefined。
AppStorage.setOrCreate('PropA', 47);
let linkToPropA1:SubscribedAbstractProperty<number> = AppStorage.link('PropA');
let linkToPropA2:SubscribedAbstractProperty<number> = AppStorage.link('PropA'); // linkToPropA2.get() == 47
linkToPropA1.set(48); // 双向同步: linkToPropA1.get() == linkToPropA2.get() == 48

setAndLink10+

static setAndLink<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>

与Link接口类似,如果给定的propName在AppStorage中存在,则返回该propName对应的属性的双向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName,返回其双向绑定数据。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。
defaultValueT当propName在AppStorage中不存在,使用defaultValue在AppStorage中初始化对应的propName。

返回值:

类型描述
SubscribedAbstractProperty<T>SubscribedAbstractProperty<T>的实例,和AppStorage中propName对应属性的双向绑定的数据。
AppStorage.setOrCreate('PropA', 47);
let link1: SubscribedAbstractProperty<number> = AppStorage.setAndLink('PropB', 49); // Create PropB 49
let link2: SubscribedAbstractProperty<number> = AppStorage.setAndLink('PropA', 50); // PropA exists, remains 47

prop10+

static prop<T>(propName: string): SubscribedAbstractProperty<T>

与AppStorage中对应的propName建立单向属性绑定。如果给定的propName在AppStorage中存在,则返回与AppStorage中propName对应属性的单向绑定数据。如果AppStorage中不存在propName,则返回undefined。单向绑定数据的修改不会被同步回AppStorage中。

说明: Prop仅支持简单类型。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。

返回值:

类型描述
SubscribedAbstractProperty<T>返回单向绑定的数据,如果AppStorage不存在对应的propName,则返回undefined。
AppStorage.setOrCreate('PropA', 47);
let prop1: SubscribedAbstractProperty<number> = AppStorage.prop('PropA');
let prop2: SubscribedAbstractProperty<number> = AppStorage.prop('PropA');
prop1.set(1); // one-way sync: prop1.get()=1; but prop2.get() == 47

setAndProp10+

static setAndProp<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>

与Prop接口类似。如果给定的propName在AppStorage存在,则返回该propName对应的属性的单向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName对应的属性,返回其单向绑定数据。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。
defaultValueT当propName在AppStorage中不存在时,使用default在AppStorage中初始化对应的propName。

返回值:

类型描述
SubscribedAbstractProperty<T>SubscribedAbstractProperty<T>的实例。
AppStorage.setOrCreate('PropA', 47);
let prop: SubscribedAbstractProperty<number> = AppStorage.setAndProp('PropB', 49); // PropA -> 47, PropB -> 49

has10+

static has(propName: string): boolean

判断propName对应的属性是否在AppStorage中存在。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。

返回值:

类型描述
boolean如果propName对应的属性在AppStorage中存在,则返回true。不存在则返回false。
AppStorage.has('simpleProp');

get10+

static get<T>(propName: string): T | undefined

获取propName在AppStorage中对应的属性。如果不存在返回undefined。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。

返回值:

类型描述
T | undefinedAppStorage中propName对应的属性,如果不存在返回undefined。
AppStorage.setOrCreate('PropA', 47);
let value: number = AppStorage.get('PropA') as number; // 47

set10+

static set<T>(propName: string, newValue: T): boolean

在AppStorage中设置propName对应属性的值。如果newValue的值和propName对应属性的值相同,即不需要做赋值操作,状态变量不会通知UI刷新propName对应属性的值。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。
newValueT属性值,不能为undefined或null。

返回值:

类型描述
boolean如果AppStorage不存在propName对应的属性,或者设置的newValue是undefined或者null,返回false。设置成功则返回true。
AppStorage.setOrCreate('PropA', 48);
let res: boolean = AppStorage.set('PropA', 47) // true
let res1: boolean = AppStorage.set('PropB', 47) // false

setOrCreate10+

static setOrCreate<T>(propName: string, newValue: T): void

如果propName已经在AppStorage中存在,并且newValue和propName对应属性的值不同,则设置propName对应属性的值为newValue,否则状态变量不会通知UI刷新propName对应属性的值。 如果propName不存在,则创建propName属性,值为newValue。setOrCreate只可以创建单个AppStorage的键值对,如果想创建多个AppStrage键值对,可以多次调用此方法。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。
newValueT属性值,不能为undefined或null。
AppStorage.setOrCreate('simpleProp', 121);

delete10+

static delete(propName: string): boolean

在AppStorage中删除propName对应的属性。

在AppStorage中删除该属性的前提是必须保证该属性没有订阅者。如果有订阅者,则返回false。删除成功返回true。

属性的订阅者为Link、Prop等接口绑定的propName,以及@StorageLink('propName')和@StorageProp('propName')。这就意味着如果自定义组件中使用@StorageLink('propName')和@StorageProp('propName')或者SubscribedAbstractProperty实例依旧对propName有同步关系,则该属性不能从AppStorage中删除。

参数:

参数名类型必填参数描述
propNamestringAppStorage中的属性名。

返回值:

类型描述
boolean如果AppStorage中有对应的属性,且该属性已经没有订阅者,则删除成功,返回true。如果属性不存在,或者该属性还存在订阅者,则返回false。
AppStorage.setOrCreate('PropA', 47);
AppStorage.link<number>('PropA');
let res: boolean = AppStorage.delete('PropA'); // false, PropA still has a subscriber

AppStorage.setOrCreate('PropB', 48);
let res1: boolean = AppStorage.delete('PropB'); // true, PropB is deleted from AppStorage successfully

keys10+

static keys(): IterableIterator<string>

返回AppStorage中所有的属性名。

返回值:

类型描述
IterableIterator<string>AppStorage中所有的属性名。
AppStorage.setOrCreate('PropB', 48);
let keys: IterableIterator<string> = AppStorage.keys();

clear10+

static clear(): boolean

清除AppStorage的所有的属性。在AppStorage中清除所有属性的前提是,已经没有任何订阅者。如果有,则什么都不做返回false;删除成功返回true。

订阅者的含义和参考Delete。

返回值:

类型描述
boolean如果AppStorage中的属性已经没有订阅者,则清除成功,返回true。否则返回false。
AppStorage.setOrCreate('PropA', 47);
let res: boolean = AppStorage.clear(); // true, there are no subscribers

size10+

static size(): number

返回AppStorage中的属性数量。

返回值:

类型描述
number返回AppStorage中属性的数量。
AppStorage.setOrCreate('PropB', 48);
let res: number = AppStorage.size(); // 1

LocalStorage9+

LocalStorage具体UI使用说明,详见LocalStorage(页面级UI状态存储)

constructor9+

constructor(initializingProperties?: Object)

创建一个新的LocalStorage实例。使用Object.keys(initializingProperties)返回的属性和其数值,初始化LocalStorage实例。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
initializingPropertiesObject用initializingProperties包含的属性和数值初始化LocalStorage。initializingProperties不能为undefined。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);

getShared10+

static getShared(): LocalStorage

获取当前stage共享的LocalStorage实例。

从API version 9开始,该接口支持在ArkTS卡片中使用。

**模型约束:**此接口仅可在Stage模型下使用。

返回值:

类型描述
LocalStorage返回LocalStorage实例。

getShared具体使用,见在UI页面通过getShared接口获取在通过loadContent共享的LocalStorage实例

has9+

has(propName: string): boolean

判断propName对应的属性是否在LocalStorage中存在。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。

返回值:

类型描述
boolean如果propName对应的属性在AppStorage中存在,则返回true。不存在则返回false。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
storage.has('PropA'); // true

get9+

get<T>(propName: string): T | undefined

获取propName在LocalStorage中对应的属性。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。

返回值:

类型描述
T | undefinedLocalStorage中propName对应的属性,如果不存在返回undefined。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let value: number = storage.get('PropA') as number; // 47

set9+

set<T>(propName: string, newValue: T): boolean

在LocalStorage中设置propName对应属性的值。如果newValue的值和propName对应属性的值相同,即不需要做赋值操作,状态变量不会通知UI刷新propName对应属性的值。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。
newValueT属性值,不能为undefined或者null。

返回值:

类型描述
boolean如果LocalStorage不存在propName对应的属性,或者设置的newValue是undefined或者null,返回false。设置成功返回true。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let res: boolean = storage.set('PropA', 47); // true
let res1: boolean = storage.set('PropB', 47); // false

setOrCreate9+

setOrCreate<T>(propName: string, newValue: T): boolean

如果propName已经在LocalStorage中存在,并且newValue和propName对应属性的值不同,则设置propName对应属性的值为newValue,否则状态变量不会通知UI刷新propName对应属性的值。 如果propName不存在,则创建propName属性,值为newValue。setOrCreate只可以创建单个LocalStorage的键值对,如果想创建多个LocalStorage键值对,可以多次调用此方法。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。
newValueT属性值,不能为undefined或者null。

返回值:

类型描述
boolean如果设置的newValue是undefined或者null,返回false。
如果LocalStorage存在propName,则更新其值为newValue,返回true。
如果LocalStorage不存在propName,则创建propName,并初始化其值为newValue,返回true。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let res: boolean =storage.setOrCreate('PropA', 121); // true
let res1: boolean =storage.setOrCreate('PropB', 111); // true
let res2: boolean =storage.setOrCreate('PropB', null); // false

link9+

link<T>(propName: string): SubscribedAbstractProperty<T>

如果给定的propName在LocalStorage实例中存在,则返回与LocalStorage中propName对应属性的双向绑定数据。

双向绑定数据的修改会被同步回LocalStorage中,LocalStorage会将变化同步到所有绑定该propName的数据和Component中。

如果LocalStorage中不存在propName,则返回undefined。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。

返回值:

类型描述
SubscribedAbstractProperty<T>SubscribedAbstractProperty<T>的实例,如果AppStorage不存在对应的propName,再返回undefined。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let linkToPropA1: SubscribedAbstractProperty<number> = storage.link('PropA');
let linkToPropA2: SubscribedAbstractProperty<number> = storage.link('PropA'); // linkToPropA2.get() == 47
linkToPropA1.set(48); // 双向同步: linkToPropA1.get() == linkToPropA2.get() == 48

setAndLink9+

setAndLink<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>

与Link接口类似,如果给定的propName在LocalStorage存在,则返回该propName对应的属性的双向绑定数据。如果不存在,则使用defaultValue在LocalStorage创建和初始化propName,返回其双向绑定数据。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。
defaultValueT当propName在LocalStorage中不存在,使用default在LocalStorage中初始化对应的propName。

返回值:

类型描述
SubscribedAbstractProperty<T>SubscribedAbstractProperty<T>的实例,如果AppStorage不存在对应的propName,再返回undefined。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let link1: SubscribedAbstractProperty<number> = storage.setAndLink('PropB', 49); // Create PropB 49
let link2: SubscribedAbstractProperty<number> = storage.setAndLink('PropA', 50); // PropA exists, remains 47

prop9+

prop<S>(propName: string): SubscribedAbstractProperty<S>

如果给定的propName在LocalStorage存在,则返回与LocalStorage中propName对应属性的单向绑定数据。如果LocalStorage中不存在propName,则返回undefined。单向绑定数据的修改不会被同步回LocalStorage中。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。

返回值:

类型描述
SubscribedAbstractProperty<S>SubscribedAbstractProperty<S>的实例,如果AppStorage不存在对应的propName,在返回undefined。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let prop1: SubscribedAbstractProperty<number> = storage.prop('PropA');
let prop2: SubscribedAbstractProperty<number> = storage.prop('PropA');
prop1.set(1); // one-way sync: prop1.get()=1; but prop2.get() == 47

setAndProp9+

setAndProp<S>(propName: string, defaultValue: S): SubscribedAbstractProperty<S>

propName在LocalStorage存在,则返回该propName对应的属性的单向绑定数据。如果不存在,则使用defaultValue在LocalStorage创建和初始化propName对应的属性,返回其单向绑定数据。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。
defaultValueS当propName在AppStorage中不存在,使用default在AppStorage中初始化对应的propName。

返回值:

类型描述
SubscribedAbstractProperty<S>SubscribedAbstractProperty<S>的实例,和AppStorage中propName对应属性的单向绑定的数据。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let prop: SubscribedAbstractProperty<number> = storage.setAndProp('PropB', 49); // PropA -> 47, PropB -> 49

delete9+

delete(propName: string): boolean

在LocalStorage中删除propName对应的属性。删除属性的前提是该属性已经没有订阅者,如果有则返回false。删除成功则返回true。

属性的订阅者是link,prop接口绑定的propName,以及@LocalStorageLink('propName')和@LocalStorageProp('propName')。如果自定义组件Component中使用或者SubscribedAbstractProperty(link和prop接口的返回类型)依旧有同步关系,则该属性不能从LocalStorage中删除。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
propNamestringLocalStorage中的属性名。

返回值:

类型描述
boolean如果LocalStorage中有对应的属性,且该属性已经没有订阅者,则删除成功返回true。如果属性不存在,或者该属性还存在订阅者,则返回false。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
storage.link<number>('PropA');
let res: boolean = storage.delete('PropA'); // false, PropA still has a subscriber
let res1: boolean = storage.delete('PropB'); // false, PropB is not in storage
storage.setOrCreate('PropB', 48);
let res2: boolean = storage.delete('PropB'); // true, PropB is deleted from storage successfully

keys9+

keys(): IterableIterator<string>

返回AppStorage中所有的属性名。

从API version 9开始,该接口支持在ArkTS卡片中使用。

返回值:

类型描述
IterableIterator<string>LocalStorage中所有的属性名。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let keys: IterableIterator<string> = storage.keys();

size9+

size(): number

返回LocalStorage中的属性数量。

从API version 9开始,该接口支持在ArkTS卡片中使用。

返回值:

类型描述
number返回键值对的数量。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let res: number = storage.size(); // 1

clear9+

clear(): boolean

清除LocalStorage的所有的属性。在LocalStorage中清除所有属性的前提是已经没有任何订阅者。如果有则返回false;清除成功返回true。

从API version 9开始,该接口支持在ArkTS卡片中使用。

返回值:

类型描述
boolean如果LocalStorage中的属性已经没有任何订阅者,则清除成功,返回true。否则返回false。
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
let res: boolean = storage.clear(); // true, there are no subscribers

SubscribedAbstractProperty

get9+

abstract get(): T

读取从AppStorage/LocalStorage同步属性的数据。

从API version 9开始,该接口支持在ArkTS卡片中使用。

返回值:

类型描述
TAppStorage/LocalStorage同步属性的数据。
AppStorage.SetOrCreate('PropA', 47); 
let prop1:SubscribedAbstractProperty<number> = AppStorage.Prop('PropA');    
prop1.get(); //  prop1.get()=47

set9+

abstract set(newValue: T): void

设置AppStorage/LocalStorage同步属性的数据。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名类型必填参数描述
newValueT要设置的数据。
AppStorage.SetOrCreate('PropA', 47);
let prop1:SubscribedAbstractProperty<number> = AppStorage.Prop('PropA');
prop1.set(1); //  prop1.get()=1

aboutToBeDeleted10+

abstract aboutToBeDeleted(): void

取消SubscribedAbstractProperty实例对AppStorage/LocalStorage单/双向同步关系。

AppStorage.SetOrCreate('PropA', 47);
let link = AppStorage.SetAndLink('PropB', 49); // PropA -> 47, PropB -> 49
link.aboutToBeDeleted();
link.set(50); // PropB -> 49, link.get() --> undefined

PersistentStorage

PersistentStorage具体UI使用说明,详见PersistentStorage(持久化存储UI状态)

PersistPropsOptions

参数名类型必填参数描述
keystring属性名。
defaultValuenumber|string|boolean在PersistentStorage和AppStorage未查询到时,则使用默认值初始化初始化它。不允许为undefined和null。

persistProp10+

static persistProp<T>(key: string, defaultValue: T): void

将AppStorage中key对应的属性持久化到文件中。该接口的调用通常在访问AppStorage之前。

确定属性的类型和值的顺序如下:

  1. 如果PersistentStorage文件中存在key对应的属性,在AppStorage中创建对应的propName,并用在PersistentStorage中找到的key的属性初始化。

  2. 如果PersistentStorage文件中没有查询到key对应的属性,则在AppStorage中查找key对应的属性。如果找到key对应的属性,则将该属性持久化。

  3. 如果AppStorage也没查找到key对应的属性,则在AppStorage中创建key对应的属性。用defaultValue初始化其值,并将该属性持久化。

根据上述的初始化流程,如果AppStorage中有该属性,则会使用其值,覆盖掉PersistentStorage文件中的值。由于AppStorage是内存内数据,该行为会导致数据丧失持久化能力。

参数:

参数名类型必填参数描述
keystring属性名。
defaultValueT在PersistentStorage和AppStorage未查询到时,则使用默认值初始化初始化它。不允许为undefined和null。

示例:

persistProp具体使用,见从AppStorage中访问PersistentStorage初始化的属性

deleteProp10+

static deleteProp(key: string): void

PersistProp的逆向操作。将key对应的属性从PersistentStorage删除,后续AppStorage的操作,对PersistentStorage不会再有影响。

参数:

参数名类型必填参数描述
keystringPersistentStorage中的属性名。
PersistentStorage.deleteProp('highScore');

persistProps10+

static persistProps(props: PersistPropsOptions[]): void

行为和PersistProp类似,不同在于可以一次性持久化多个数据,适合在应用启动的时候初始化。

参数:

参数名类型必填参数描述
propsPersistPropsOptions[]持久化数组。
PersistentStorage.persistProps([{ key: 'highScore', defaultValue: '0' }, { key: 'wightScore', defaultValue: '1' }]);

keys10+

static keys(): Array<string>

返回所有持久化属性的key的数组。

返回值:

类型描述
Array<string>返回所有持久化属性的key的数组。
let keys: Array<string> = PersistentStorage.keys();

Environment

Environment具体使用说明,详见Environment(设备环境查询)

EnvPropsOptions

参数名类型必填参数描述
keystring环境变量名称,支持的范围详见内置环境变量说明。
defaultValuenumber|string|boolean查询不到环境变量key,则使用defaultValue作为默认值存入AppStorage中。

envProp10+

static envProp<S>(key: string, value: S): boolean

将Environment的内置环境变量key存入AppStorage中。如果系统中未查询到Environment环境变量key的值,则使用默认值value,存入成功,返回true。如果AppStorage已经有对应的key,则返回false。

所以建议在程序启动的时候调用该接口。

在没有调用EnvProp,就使用AppStorage读取环境变量是错误的。

参数:

参数名类型必填参数描述
keystring环境变量名称,支持的范围详见内置环境变量说明。
valueS查询不到环境变量key,则使用value作为默认值存入AppStorage中。

返回值:

类型描述
boolean如果key对应的属性在AppStorage中存在,则返回false。不存在则在AppStorage中创建key对应的属性,返回true。

示例:

EnvProp具体使用,见从UI中访问Environment参数

envProps10+

static envProps(props: EnvPropsOptions[]): void

和EnvProp类似,不同点在于参数为数组,可以一次性初始化多个数据。建议在应用启动时调用,将系统环境变量批量存入AppStorage中。

参数:

参数名类型必填参数描述
propsEnvPropsOptions[]系统环境变量和默认值的键值对的数组。
Environment.envProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, {
  key: 'languageCode',
  defaultValue: 'en'
}, { key: 'prop', defaultValue: 'hhhh' }]);

keys10+

static keys(): Array<string>

返回环境变量的属性key的数组。

返回值:

类型描述
Array<string>返回关联的系统项数组。
Environment.envProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, {
  key: 'languageCode',
  defaultValue: 'en'
}, { key: 'prop', defaultValue: 'hhhh' }]);

let keys: Array<string> = Environment.keys(); // accessibilityEnabled, languageCode, prop

内置环境变量说明

key类型说明
accessibilityEnabledstring无障碍屏幕朗读是否启用。
colorModeColorMode深浅色模式,可选值为:
- ColorMode.LIGHT:浅色模式;
- ColorMode.DARK:深色模式。
fontScalenumber字体大小比例。
fontWeightScalenumber字重比例。
layoutDirectionLayoutDirection布局方向类型,可选值为:
- LayoutDirection.LTR:从左到右;
- LayoutDirection.RTL:从右到左。
languageCodestring当前系统语言,小写字母,例如zh。

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1540552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览…

Unity:2D

目录 1. 简介 2. 2D Sorting 3. 9-slicing Sprites 3.1 9-slicing and Colliders 4. Sprite Renderer 5. Sprite Creator 6. Sprite Editor 6.1 Slice 6.1 Resize polygons 6.2 Custom Outline 6.3 Custom Physics Shape 6.4 Secondary Textures 6.5 Data Provider…

AI在融媒体领域的应用探讨

AI在融媒体领域的应用探讨 ChatGPT是人工智能的一种应用形式&#xff0c;它属于自然语言处理&#xff08;NLP&#xff0c;Nature Language Process&#xff09;领域。 2022年11月30日&#xff0c;由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT一夜爆火&#xff0c;…

BUUCTF-Misc12

[BJDCTF2020]纳尼1 1.打开附件 一张打不开的图片和一个没什么用的文本文档 2.010 Editor 用010 Editor 打开6.gif这个文件 发现文件头缺少 .gif 的文件头是47 49 46 38 添加文件头并保存 得到一个动图&#xff0c;由四张图片组成 得到一串看似像base64的编码&#xff1a;Q…

解析SpringBoot自动装配原理前置知识:解析条件注释的原理

什么是自动装配&#xff1f; Spring提供了向Bean中自动注入依赖的这个功能&#xff0c;这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX&#xff0c;因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看Conditi…

本地运行环境工具UPUPWANK(win)和Navicat数据库管理工具

UPUPWANK安装地址&#xff1a;https://www.upupw.net 1.进入UPUPWANK后点击一键开启 2.新增项目 这里请千万注意80端口&#xff0c;如果80端口被占用了&#xff0c;请记住去任务管理器关闭占用80端口的进程。不然就不会成功显示。&#xff08;笔者含泪警告&#xff0c;一晚上的…

Python Qt Designer 初探

代码下载在最下面 #开发环境安装# 本示例在Windows11下, 使用VSCode开发, Python 3.12.2, Qt Designer 5.11 VSCode插件Python、Python Debugger、PYQT Integration、Pylance (准备) VSCode自行官网下载 Visual Studio Code - Code Editing. Redefined (准备) Python 直接…

Linux进程的管理和进程的状态

进程的基本概念&#xff1a; 程序的一个执行实例 &#xff0c;正在执行的程序等等 ——— 课本概念 担当分配系统资源的实体&#xff0c;例如cpu时间&#xff0c;内存 -----内核的观点 一、进程的管理 processbar 存储在磁盘中的可执行文件 可执行文件在启动/运行的同时&…

Photoshop 工具使用详解(全集 · 2024版)

全面介绍 Photoshop 工具箱里的工具&#xff0c;点击下列表格中工具名称或图示&#xff0c;即可查阅工具的使用详解。 移动工具Move Tool移动选区、图层和参考线。画板工具Artboard Tool创建、移动多个画布或调整其大小。moVe快捷键&#xff1a;V 矩形选框工具 Rectangular Mar…

mac硬盘拷贝到另外硬盘 苹果电脑怎么拷贝到移动硬盘

在当今的信息时代&#xff0c;数据的存储和传输是我们日常生活和工作中不可或缺的一部分。我们经常需要使用各种硬盘来保存和备份我们的数据&#xff0c;比如内置硬盘、移动硬盘、U盘等。但是&#xff0c;不同的硬盘可能使用不同的文件系统&#xff0c;这给我们的数据拷贝带来了…

C++11:左值与右值|移动构造|移动赋值

​ &#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マイノリティ脈絡—ずっと真夜中でいいのに。 0:24━━━━━━️&#x1f49f;──────── 4:02 &#x1f504; …

每日一题 第三十期 洛谷 [USACO1.5] [IOI1994]数字三角形 Number Triangles

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Doris是一款高性能、开源的实时分析数据仓库&#xff0c;旨在为用户提供毫秒级查询响应、高并发、高可用以及易于扩展的OLAP解决方…

基于“云”重构“百度云盘”

这一篇文章是和上一篇连着的哟&#xff01; # docker run -p 80:80 -d -v /data/owncloud/:/var/www/html owncloud 一、【安装完成】 二、【打开浏览器】 三、【回到这个熟悉的界面&#xff0c;掉。】 四、【上传文件】 试了可以看哇偶&#xff01;&#xff01;&#xff01…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展&#xff0c;能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题&#xff0c;导致企业的经济效益降低。目前&#xff0c;提高企业的生产计划管理是改善能源企业现状最有利的途…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录&#xff0c;并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…

【OpenGL手册-21】高级GLSL编程

一、说明 这章不会向你展示什么新的功能&#xff0c;也不会对你的场景的视觉效果有较大提升。但是&#xff0c;本文能够提供最深刻的GLSL表达&#xff0c;也深入探讨了一些GLSL有趣的知识&#xff0c;它们可能在将来能帮助你。基本来说有些不可不知的内容和功能在你去使用GLSL创…

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略&#xff0c;希望通过本文&#xff0c;能够帮助大家规范 Git Commit&#xff0c;并且展示相关 …