一、概述

Environment是ArkUI框架在应用程序启动时创建的单例对象,用于提供一系列描述应用程序运行状态的属性,其所有属性不可变(应用不可写入)且为简单类型,主要为AppStorage提供设备环境相关信息,以辅助应用根据设备环境做出不同的处理逻辑。

二、Environment内置参数

  1. accessibilityEnabled:数据类型为boolean,用于获取无障碍屏幕读取是否启用。
  2. colorMode:类型为ColorMode,其取值包括ColorMode.LIGHT(浅色)和ColorMode.DARK(深色),用于表示色彩模型类型。
  3. fontScale:数据类型为number,表示字体大小比例,范围在[0.85, 1.45]之间。
  4. fontWeightScale:也是number类型,用于表示字体粗细程度,范围是[0.6, 1.6]
  5. layoutDirection:类型为LayoutDirection,包含LayoutDirection.LTR(从左到右)和LayoutDirection.RTL(从右到左),用于确定布局方向类型。
  6. languageCodestring类型,存储当前系统语言值,且取值必须为小写字母,例如zh

三、使用场景

(一)从UI中访问Environment参数

  1. 存入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

  2. 获取并使用环境变量

    • 首先使用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');
      })
    })
  }
}

严肃的烤土司
1 声望0 粉丝