1# Environment:设备环境查询
2
3
4开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,深浅色模式等,需要用到Environment设备环境查询。
5
6
7Environment是ArkUI框架在应用程序启动时创建的单例对象。它为AppStorage提供了一系列描述应用程序运行状态的属性。Environment的所有属性都是不可变的(即应用不可写入),所有的属性都是简单类型。
8
9
10Environment提供了读取系统某些环境变量的能力,具体见[Environment内置参数](#environment内置参数),并将其值写入AppStorage里,所以开发者需要通过AppStorage才能获取环境变量的值。
11
12在阅读本文档前,建议提前阅读:[AppStorage](./arkts-appstorage.md)。
13
14## Environment内置参数
15
16| 键 | 数据类型 | 描述                                      |
17| ------------------ | ------------------ | ------------------ |
18| accessibilityEnabled              | boolean                  | 获取无障碍屏幕读取是否启用。                 |
19| colorMode              | ColorMode                  | 色彩模型类型:选项为ColorMode.LIGHT: 浅色,ColorMode.DARK: 深色。                 |
20| fontScale              | number                  | 字体大小比例。开发者需要配置[configuration](./app-configuration-file.md#configuration标签)使fontScale跟随系统变化。                |
21| fontWeightScale              | number                  | 字体粗细程度。                |
22| layoutDirection              | LayoutDirection                  | 布局方向类型:包括LayoutDirection.LTR: 从左到右,LayoutDirection.RTL: 从右到左。                 |
23| languageCode              | string                  | 当前系统语言值,取值必须为小写字母, 例如zh。                 |
24
25
26## 使用场景
27
28
29### 从UI中访问Environment参数
30
31- 使用Environment.envProp将设备运行的环境变量存入AppStorage中:
32
33  ```ts
34  // 将设备的语言code存入AppStorage,默认值为en
35  Environment.envProp('languageCode', 'en');
36  ```
37
38- 可以使用\@StorageProp链接到Component中。
39
40  ```ts
41  @StorageProp('languageCode') lang : string = 'en';
42  ```
43
44设备环境到Component的更新链:Environment --> AppStorage -->Component。
45
46> **说明:**
47>
48> \@StorageProp关联的环境参数可以在本地更改,但不能同步回AppStorage中,因为应用对环境变量参数是不可写的,只能在Environment中查询。
49
50
51```ts
52// 将设备languageCode存入AppStorage中
53Environment.envProp('languageCode', 'en');
54
55@Entry
56@Component
57struct Index {
58  @StorageProp('languageCode') languageCode: string = 'en';
59
60  build() {
61    Row() {
62      Column() {
63        // 输出当前设备的languageCode
64        Text(this.languageCode)
65      }
66    }
67  }
68}
69```
70
71
72### 应用逻辑使用Environment
73
74
75```ts
76// 使用Environment.EnvProp将设备运行languageCode存入AppStorage中;
77Environment.envProp('languageCode', 'en');
78// 从AppStorage获取单向绑定的languageCode的变量
79const lang: SubscribedAbstractProperty<string> = AppStorage.prop('languageCode');
80
81if (lang.get() === 'zh') {
82  console.info('你好');
83} else {
84  console.info('Hello!');
85}
86```
87
88
89## 限制条件
90
91
92Environment和UIContext相关联,需要在[UIContext](../reference/apis-arkui/js-apis-arkui-UIContext.md#uicontext)明确的时候才可以调用。可以通过在[runScopedTask](../reference/apis-arkui/js-apis-arkui-UIContext.md#runscopedtask)里明确上下文。如果没有在UIContext明确的地方调用,将导致无法查询到设备环境数据。
93
94
95```ts
96// EntryAbility.ets
97import { UIAbility } from '@kit.AbilityKit';
98import { window } from '@kit.ArkUI';
99
100export default class EntryAbility extends UIAbility {
101  onWindowStageCreate(windowStage: window.WindowStage) {
102    windowStage.loadContent('pages/Index');
103    let window = windowStage.getMainWindow()
104    window.then(window => {
105      let uicontext = window.getUIContext()
106      uicontext.runScopedTask(() => {
107        Environment.envProp('languageCode', 'en');
108      })
109    })
110  }
111}
112```