一、概述
Environment是ArkUI框架在应用程序启动时创建的单例对象,用于提供一系列描述应用程序运行状态的属性,其所有属性不可变(应用不可写入)且为简单类型,主要为AppStorage提供设备环境相关信息,以辅助应用根据设备环境做出不同的处理逻辑。
二、Environment内置参数
-
accessibilityEnabled
:数据类型为boolean
,用于获取无障碍屏幕读取是否启用。 -
colorMode
:类型为ColorMode
,其取值包括ColorMode.LIGHT
(浅色)和ColorMode.DARK
(深色),用于表示色彩模型类型。 -
fontScale
:数据类型为number
,表示字体大小比例,范围在[0.85, 1.45]
之间。 -
fontWeightScale
:也是number
类型,用于表示字体粗细程度,范围是[0.6, 1.6]
。 -
layoutDirection
:类型为LayoutDirection
,包含LayoutDirection.LTR
(从左到右)和LayoutDirection.RTL
(从右到左),用于确定布局方向类型。 -
languageCode
:string
类型,存储当前系统语言值,且取值必须为小写字母,例如zh
。
三、使用场景
(一)从UI中访问Environment参数
-
存入AppStorage并链接到Component
- 使用
Environment.envProp('languageCode', 'en');
将设备运行的环境变量(如语言code)存入AppStorage,其中'en'
为默认值。 - 然后可以在组件中使用
@StorageProp('languageCode') lang : string = 'en';
将其链接到Component中,实现设备环境到Component的更新链:Environment --> AppStorage --> Component
。 - 注意,
@StorageProp
关联的环境参数可以在本地更改,但不能同步回AppStorage中,因为应用对环境变量参数不可写,只能查询。例如:
- 使用
// 将设备languageCode存入AppStorage中
Environment.envProp('languageCode', 'en');
@Entry
@Component
struct Index {
@StorageProp('languageCode') languageCode: string = 'en';
build() {
Row() {
Column() {
// 输出当前设备的languageCode
Text(this.languageCode)
}
}
}
}
(二)应用逻辑使用Environment
-
获取并使用环境变量
- 首先使用
Environment.envProp('languageCode', 'en');
将设备运行的languageCode
存入AppStorage。 - 接着从AppStorage获取单向绑定的
languageCode
变量,如const lang: SubscribedAbstractProperty<string> = AppStorage.prop('languageCode');
,然后根据该变量的值进行逻辑判断,例如:
- 首先使用
// 使用Environment.EnvProp将设备运行languageCode存入AppStorage中;
Environment.envProp('languageCode', 'en');
// 从AppStorage获取单向绑定的languageCode的变量
const lang: SubscribedAbstractProperty<string> = AppStorage.prop('languageCode');
if (lang.get() === 'zh') {
console.info('你好');
} else {
console.info('Hello!');
}
四、限制条件
Environment和UIContext相关联,需要在UIContext明确的时候才可以调用。通常可以通过在runScopedTask
里明确上下文,否则将导致无法查询到设备环境数据。例如在EntryAbility.ets
中:
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.loadContent('pages/Index');
let window = windowStage.getMainWindow()
window.then(window => {
let uicontext = window.getUIContext()
uicontext.runScopedTask(() => {
Environment.envProp('languageCode', 'en');
})
})
}
}
Top comments (0)