给鸿蒙 App 增加跨平台运行环境一键检测能力,识别操作系统、构建模式、设计风格、设备类型、处理器核心数与系统语言,纯 Dart 零权限即取即用 —— platform_info 鸿蒙使用指南
开发工具: 华为云码道
本文配套仓库:https://atomgit.com/CPF-Flutter/fluttertpc_platform_info(TAG:5.0.0-ohos-1.0.0,分支:master),文中示例代码位于仓库 example/ 目录。

什么是平台信息检测? 在跨平台 Flutter 应用中,不同操作系统(Android、iOS、鸿蒙、Windows、macOS、Linux)有不同的设计风格(Material vs Cupertino)、不同的设备类型(Mobile vs Desktop)、不同的系统语言与处理器核心数。平台信息检测库让开发者用一套统一的 API 在运行时获取这些信息,并基于
when回调模式做条件分支——无需手写if-else链,代码在六端共用同一份逻辑,运行在哪端就按哪端的特性执行。

把应用运行时的平台环境信息一次性检测出来,是跨平台条件渲染、设备适配、调试日志场景下的高频需求:判断操作系统做差异化 UI、区分构建模式控制日志输出、识别设备类型调整布局、读取处理器核心数优化并发。鸿蒙应用同样需要这个能力。本文介绍如何使用鸿蒙化适配后的 Flutter 三方库 platform_info,用一个 platform 单例在鸿蒙 App 内获取操作系统、版本号、构建模式、设计风格、设备类型、处理器核心数、系统语言等全套运行环境信息,并附上 OpenHarmony-6.0.0.115 真机的完整实测记录。
一、最终运行效果
应用启动后,页面以卡片列表展示十二项平台信息:平台类型(VM Native)、操作系统(HarmonyOS,橙色高亮)、系统版本、构建模式(Debug,红色高亮)、设计风格、设备类型(Mobile)、处理器核心数、系统语言、欢迎消息(Welcome to HarmonyOS!)、是否为鸿蒙系统(是)、是否为移动设备(是)、是否为 Material 设计(是)。
| 验证点 | 结果 |
|---|---|
| 应用启动,Flutter 页面正常渲染十二项平台信息卡片 | 通过 |
| 操作系统显示为 HarmonyOS,橙色高亮 | 通过 |
| 构建模式显示为 Debug,红色高亮 | 通过 |
| 欢迎消息显示"Welcome to HarmonyOS!" | 通过 |
| 是否为鸿蒙系统显示"是" | 通过 |
| 是否为移动设备显示"是" | 通过 |
| 是否为 Material 设计显示"是" | 通过 |
| 全程无需申请任何敏感权限 | 通过 |
鸿蒙技术点:FlutterPage 与 XComponent 渲染管线
鸿蒙侧的 Flutter 渲染入口是FlutterPage组件,它在Index.ets中被@Entry组件的build()方法直接使用。FlutterPage内部封装了XComponent——OpenHarmony 提供的底层渲染画布组件。XComponent通过 NAPI 桥接 C++ 引擎层,将 Flutter 的 Skia 渲染管线挂载到鸿蒙的渲染树中,使 Dart 层的 Widget 树(包括十二项平台信息卡片列表)在鸿蒙设备上完整渲染。FlutterAbility作为容器 Ability,管理FlutterEngine的生命周期,在configureFlutterEngine中注册所有平台插件。
二、platform_info 是什么
platform_info 原库(pub.dev 5.0.0,作者 PlugFox)是一个跨平台运行环境信息检测库,提供统一的 platform 单例获取当前运行环境的操作系统、版本号、构建模式、设计风格、设备类型、处理器核心数、系统语言等信息,并支持 when 回调模式做条件分支。鸿蒙适配版在其基础上新增了 OpenHarmony / HarmonyOS 平台支持:Dart 层新增 OperatingSystem.ohos 枚举值与鸿蒙检测逻辑,将鸿蒙归类为移动设备与 Material 设计阵营;OHOS 平台新增原生插件桩实现。
几个对使用者友好的特点:
- 纯 Dart 核心:操作系统检测、版本号读取、构建模式判断、设计风格归类、设备类型判断全部为纯 Dart 实现,通过
dart:io的Platform类读取环境信息,不依赖任何平台 API,逻辑在六端完全一致; - 零权限:所有信息来源于 Dart 运行时环境与
dart:io标准库,OHOS 平台桩仅返回版本字符串,不需要在module.json5中申请任何敏感权限; - 鸿蒙原生识别:
vm_host_platform.dart中通过io.Platform.operatingSystemVersion字符串包含ohos或harmony来识别鸿蒙系统,返回OperatingSystem.ohos(),name为'HarmonyOS'; - sealed class 枚举:
OperatingSystem使用 Dart 3 的sealed class实现,每个操作系统都是final class子类,支持switch模式匹配与when回调,类型安全且穷尽性检查; - when 回调链:
platform.when()方法接收操作系统、设计风格、设备类型、IO/Web、构建模式五类回调,按优先级顺序检查,返回第一个匹配的结果——无需手写if-else链; - 跨平台一套代码:Android、iOS、鸿蒙、Windows、macOS、Linux、Web 共用同一套 API,运行在哪端就按哪端的特性返回信息。
接口说明
Platform 单例属性
| 名称 | 描述 | 类型 | 返回值 | 鸿蒙平台支持 |
|---|---|---|---|---|
platform.operatingSystem | 当前操作系统 | 属性 | OperatingSystem | 是(OperatingSystem.ohos()) |
platform.version | 系统版本号 | 属性 | String | 是 |
platform.buildMode | 构建模式 | 属性 | BuildMode | 是 |
platform.locale | 系统语言 | 属性 | String | 是 |
platform.numberOfProcessors | 处理器核心数 | 属性 | int | 是 |
platform.type | 宿主平台类型 | 属性 | HostPlatformType | 是(HostPlatformType.vm()) |
platform.mobile | 是否为移动设备 | 属性 | bool | 是(true) |
platform.desktop | 是否为桌面设备 | 属性 | bool | 是(false) |
platform.material | 是否为 Material 设计 | 属性 | bool | 是(true) |
platform.cupertino | 是否为 Cupertino 设计 | 属性 | bool | 是(false) |
platform.android | 是否为 Android | 属性 | bool | 是(false) |
platform.ios | 是否为 iOS | 属性 | bool | 是(false) |
platform.ohos | 是否为鸿蒙 | 属性 | bool | 是(true) |
platform.fuchsia | 是否为 Fuchsia | 属性 | bool | 是(false) |
platform.linux | 是否为 Linux | 属性 | bool | 是(false) |
platform.macOS | 是否为 macOS | 属性 | bool | 是(false) |
platform.windows | 是否为 Windows | 属性 | bool | 是(false) |
platform.unknown | 是否为未知系统 | 属性 | bool | 是(false) |
platform.vm | 是否为 VM 环境 | 属性 | bool | 是(true) |
platform.js | 是否为 JS 环境 | 属性 | bool | 是(false) |
platform.when() | 条件回调 | 方法 | PlatformResult? | 是 |
OperatingSystem 枚举值
| 枚举值 | name | mobile | material | desktop | cupertino |
|---|---|---|---|---|---|
OperatingSystem.android() | Android | true | true | false | false |
OperatingSystem.ios() | iOS | true | false | false | true |
OperatingSystem.ohos() | HarmonyOS | true | true | false | false |
OperatingSystem.macOS() | macOS | false | false | true | true |
OperatingSystem.windows() | Windows | false | false | true | false |
OperatingSystem.linux() | Linux | false | false | true | false |
OperatingSystem.fuchsia() | Fuchsia | false | true | true | false |
OperatingSystem.unknown() | Unknown | false | false | false | false |
三、环境准备
本文所有实测均在以下环境完成:
| 项 | 版本 | 说明 |
|---|---|---|
| Flutter(ohos 版) | 3.27.5-ohos-1.0.1 | 主验证环境,真机实测 |
| 编译 SDK | 5.0.0(12) | 宿主工程 compatibleSdkVersion 同值,保留带括号的旧格式 |
| DevEco Studio | 6.0.1.251 | 构建环境 |
| 真机 | OpenHarmony-6.0.0.115 SP16 | API 12 |
鸿蒙技术点:compatibleSdkVersion 与 API Level 的对应关系
compatibleSdkVersion是鸿蒙工程build-profile.json5中的关键字段,声明应用的最低兼容 API 版本。鸿蒙的 API 版本与系统版本一一对应:5.0.0(12)对应 API 12,5.1.0(18)对应 API 18,6.0.0(23)对应 API 23。真机安装时,系统会校验应用的compatibleSdkVersion不高于设备实际 API 版本,否则报"此应用暂不支持在当前设备安装"。本文 example 工程设为5.0.0(12),在 OpenHarmony-6.0.0.115 SP16 真机上可正常安装运行。
两点提醒:
- 编译鸿蒙目标需要使用 ohos 版 Flutter SDK,普通 Flutter SDK 无法编译 ohos 产物;
- 若在真机上安装应用报"此应用暂不支持在当前设备安装",是宿主工程的
compatibleSdkVersion高于设备 API 导致的,与插件无关,处理方式见 FAQ Q3。
四、引入依赖
进入工程目录,在 pubspec.yaml 中添加 git 依赖:
dependencies:
platform_info:
git:
url: https://atomgit.com/CPF-Flutter/fluttertpc_platform_info
ref: 5.0.0-ohos-1.0.0
执行命令拉取依赖:
flutter pub get
TAG 命名规则:
原库版本-ohos-版本号。
| Flutter 框架版本 | TAG 名称 | 分支名 |
|---|---|---|
| 3.27 / 3.35 | 5.0.0-ohos-1.0.0 | master |
说明:该 TAG 已在 Flutter 3.27.5-ohos-1.0.1 + OpenHarmony-6.0.0.115 SP16 真机上实测通过。
compatibleSdkVersion设为5.0.0(12)即可在 API 12 真机安装运行。库的pubspec.yaml中声明了ohos平台支持,但核心逻辑为纯 Dart 实现,不需要原生插件即可在鸿蒙上完整运行——OHOS 原生插件仅提供getPlatformVersion桩实现。
五、代码接入
5.1 导入库
import 'package:platform_info/platform_info.dart';
导入后即可使用 platform 全局单例(等价于 Platform.instance 或 Platform.I)、OperatingSystem 枚举、BuildMode 枚举、HostPlatformType 枚举。platform 是一个 Platform 类型的不可变单例,在应用启动时通过 _internalFactoryFromEnvironment 工厂构造器初始化。
5.2 获取操作系统信息
final os = platform.operatingSystem;
print('操作系统: ${os.name}'); // 操作系统: HarmonyOS
print('是否为鸿蒙: ${os.ohos}'); // 是否为鸿蒙: true
final osName = switch (platform.operatingSystem) {
const OperatingSystem.android() => 'Android',
const OperatingSystem.iOS() => 'iOS',
const OperatingSystem.ohos() => 'HarmonyOS',
const OperatingSystem.macOS() => 'macOS',
const OperatingSystem.windows() => 'Windows',
const OperatingSystem.linux() => 'Linux',
const OperatingSystem.fuchsia() => 'Fuchsia',
const OperatingSystem.unknown() || _ => 'Unknown',
};
OperatingSystem 是一个 sealed class,每个操作系统对应一个 final class 子类。鸿蒙系统对应 OperatingSystem$OHOS,其 name 属性返回 'HarmonyOS'。Dart 3 的 switch 模式匹配可以穷尽所有子类,编译器会在遗漏分支时报错。
代码逐段分析:_getOS 鸿蒙识别逻辑
vm_host_platform.dart中的_getOS静态方法负责识别当前操作系统。它首先调用io.Platform.operatingSystemVersion获取系统版本字符串(如"OpenHarmony 6.0.0"),转为小写后检查是否包含'ohos'或'harmony'关键字——若是,返回OperatingSystem.ohos()。这一检测方式利用了 Flutter ohos 引擎在dart:io层暴露的operatingSystemVersion字段中包含ohos标识的特性。检测顺序上,鸿蒙判断优先于io.Platform.isAndroid/isMacOS等标准字段,因为鸿蒙环境下这些标准字段可能也为 true(基于 Linux 内核),需优先匹配鸿蒙特征字符串。
5.3 获取系统版本与语言
print('系统版本: ${platform.version}'); // 系统版本: OpenHarmony 6.0.0
print('系统语言: ${platform.locale}'); // 系统语言: zh
print('处理器核心数: ${platform.numberOfProcessors}'); // 处理器核心数: 8
version 来自 io.Platform.operatingSystemVersion,返回鸿蒙系统的完整版本字符串。locale 来自 io.Platform.localeName,经 split('-').first.split('_').first 处理后取两字符语言代码(如 zh、en)。numberOfProcessors 来自 io.Platform.numberOfProcessors,返回设备 CPU 的逻辑核心数。
代码逐段分析:_getLocale 语言代码提取
_getLocale方法从io.Platform.localeName中提取语言代码。鸿蒙系统返回的 locale 格式可能为zh-CN或zh_CN,方法先按-分割取第一段,再按_分割取第一段,最后.trim().toLowerCase()统一为小写。若结果长度不为 2(异常情况),回退到DefaultHostPlatform的默认值'en'。这保证返回值始终是合法的两字符语言代码,避免下游处理异常。
5.4 获取构建模式
final buildMode = switch (platform.buildMode) {
BuildMode$Debug _ => 'Debug',
BuildMode$Profile _ => 'Profile',
BuildMode$Release _ => 'Release',
};
if (platform.buildMode.debug) {
print('调试模式,输出详细日志');
}
BuildMode 是一个 sealed class,三个子类 BuildMode$Debug、BuildMode$Profile、BuildMode$Release 分别对应 Debug、Profile、Release 三种构建模式。判断方式利用了 Dart 的 assert 语句仅在 Debug 模式执行的特性:若 dart.vm.product 为 true 则为 Release,若 assert 执行了则为 Debug,否则为 Profile。
代码逐段分析:_$getCurrentBuildMode 构建模式检测
构建模式检测分两步。第一步,检查const bool.fromEnvironment('dart.vm.product')——Release 构建中该值为 true,直接返回BuildMode.release()。第二步,利用assert语句的副作用:assert回调仅在 Debug 模式执行(Profile 和 Release 中被跳过),在回调中将result从BuildMode.profile()改为BuildMode.debug()。因此:Release 由第一步直接返回,Profile 是result的初始值(assert 未执行),Debug 是 assert 执行后修改的值。这一技巧在 Flutter 生态中广泛使用,是区分 Debug 与 Profile 的标准做法。
5.5 when 条件回调
final design = platform.when<String?>(
vm: () => platform.when<String>(
material: () => 'Android, Fuchsia or HarmonyOS',
cupertino: () => 'macOS or iOS',
orElse: () => 'Windows or Linux',
),
js: () => 'Web',
);
final platformMessage = platform.when<String?>(
ohos: () => 'Welcome to HarmonyOS!',
android: () => 'Welcome to Android!',
iOS: () => 'Welcome to iOS!',
orElse: () => 'Welcome to ${platform.operatingSystem.name}!',
);
when 方法是 platform_info 的核心 API,接收一组可选回调,按优先级顺序检查:第一优先级是操作系统(fuchsia、windows、android、iOS、macOS、linux、ohos、unknown),第二优先级是设计风格(material、cupertino),第三优先级是设备类型(mobile、desktop),第四优先级是 IO/Web(vm、js),第五优先级是构建模式(release、profile、debug),最后调用 orElse。返回第一个匹配回调的执行结果,若均不匹配且未设置 orElse 则返回 null。
代码逐段分析:when 回调优先级链
when方法的检查顺序经过精心设计。以鸿蒙设备为例:第一次调用when(vm: ..., js: ...)时,platform.vm为 true,匹配vm回调。在vm回调内部嵌套第二次调用when(material: ..., cupertino: ..., orElse: ...),此时进入第二优先级——设计风格检查,platform.material为 true(鸿蒙归类为 Material),匹配material回调,返回'Android, Fuchsia or HarmonyOS'。这种嵌套调用模式可以组合多维度条件,实现精细的平台分支逻辑。
5.6 设备类型与设计风格
print('是否为移动设备: ${platform.mobile}'); // 是否为移动设备: true
print('是否为桌面设备: ${platform.desktop}'); // 是否为桌面设备: false
print('是否为 Material 设计: ${platform.material}'); // 是否为 Material 设计: true
print('是否为 Cupertino 设计: ${platform.cupertino}'); // 是否为 Cupertino 设计: false
设备类型与设计风格由 constants.dart 中的集合常量决定:
kListOSForMobile:{Android, iOS, OHOS}——鸿蒙归类为移动设备kListOSForDesktop:{Windows, macOS, Fuchsia, Linux}kListOSWithMaterialDesign:{Android, Fuchsia, OHOS}——鸿蒙归类为 Material 设计kListOSWithCupertinoDesign:{macOS, iOS}
鸿蒙系统同时被归类为移动设备和 Material 设计,这与 HarmonyOS 的实际定位一致——它是移动操作系统,UI 风格偏向 Material Design。
鸿蒙技术点:sealed class 与模式匹配
Dart 3 引入了sealed class关键字,允许开发者定义封闭的类层级——所有子类必须在同一库中定义,编译器可以执行穷尽性检查。OperatingSystem是一个典型的 sealed class,其子类包括OperatingSystem$Android、OperatingSystem$OHOS等。使用switch表达式匹配 sealed class 时,若遗漏任何子类,编译器会报错。这在鸿蒙适配中尤为重要——新增OperatingSystem.ohos()子类后,所有使用switch匹配OperatingSystem的代码都会在编译时获得穷尽性检查保障,避免遗漏鸿蒙分支。
5.7 实战:平台信息展示页面
实际业务中常见的场景是应用启动页面展示当前运行环境信息,供调试或用户确认。下面是 demo 工程的完整示例:
class _PlatformInfoPageState extends State<PlatformInfoPage> {
late Map<String, String> platformInfo;
void initState() {
super.initState();
_initializePlatformInfo();
}
void _initializePlatformInfo() {
final design = platform.when<String?>(
vm: () => platform.when<String>(
material: () => 'Android, Fuchsia or HarmonyOS',
cupertino: () => 'macOS or iOS',
orElse: () => 'Windows or Linux',
),
js: () => 'Web',
);
final operatingSystem = switch (platform.operatingSystem) {
const OperatingSystem.android() => 'Android',
const OperatingSystem.fuchsia() => 'Fuchsia',
const OperatingSystem.iOS() => 'iOS',
const OperatingSystem.linux() => 'Linux',
const OperatingSystem.macOS() => 'macOS',
const OperatingSystem.windows() => 'Windows',
const OperatingSystem.ohos() => 'HarmonyOS',
const OperatingSystem.unknown() || _ => 'Unknown',
};
final buildMode = switch (platform.buildMode) {
BuildMode$Debug _ => 'Debug',
BuildMode$Profile _ => 'Profile',
BuildMode$Release _ => 'Release',
};
final platformMessage = platform.when<String?>(
ohos: () => 'Welcome to HarmonyOS!',
android: () => 'Welcome to Android!',
iOS: () => 'Welcome to iOS!',
orElse: () => 'Welcome to ${platform.operatingSystem.name}!',
);
platformInfo = {
'平台类型': platform.when<String>(
vm: () => 'VM (Native)',
js: () => 'JavaScript (Web)',
orElse: () => 'Unknown',
) ?? 'Unknown',
'操作系统': operatingSystem,
'系统版本': Platform.instance.version,
'构建模式': buildMode,
'设计风格': design ?? 'Unknown',
'设备类型': platform.mobile ? 'Mobile' : (platform.desktop ? 'Desktop' : 'Unknown'),
'处理器核心数': platform.numberOfProcessors.toString(),
'系统语言': platform.locale,
'欢迎消息': platformMessage ?? 'Welcome!',
'是否为鸿蒙系统': platform.ohos ? '是' : '否',
'是否为移动设备': platform.mobile ? '是' : '否',
'是否为Material设计': platform.material ? '是' : '否',
'是否为Cupertino设计': platform.cupertino ? '是' : '否',
};
}
}
页面使用 ListView.builder 渲染 platformInfo Map 中的每一项为卡片。每张卡片包含图标、标题和值,值颜色根据键名和值内容动态选择——HarmonyOS 橙色、Android 绿色、iOS 蓝色、Debug 红色、Release 绿色。_getIconForKey 方法为每个键分配语义化图标(操作系统用手机图标、构建模式用锤子图标、系统语言用语言图标等)。
六、运行与验证
以下为 demo 工程的真机实测记录。仓库中 example 的 Bundle Name 为 com.example.platform_info_example。
| 设备项 | 值 |
|---|---|
| 机型 | OpenHarmony 真机 |
| 系统版本 | OpenHarmony-6.0.0.115 SP16 |
| API 版本 | 12 |
| 构建环境 | Flutter 3.27.5-ohos-1.0.1, DevEco Studio 6.0.1.251 |
6.1 验证一:平台信息渲染
安装、启动 demo:
# 构建 hap 后安装
hdc install entry-default-signed.hap
# 启动 demo
hdc shell aa start -b com.example.platform_info_example -a EntryAbility
应用启动后,initState 调用 _initializePlatformInfo() 一次性采集所有平台信息。页面渲染十二张卡片,自上而下:平台类型(VM Native)、操作系统(HarmonyOS,橙色高亮)、系统版本(OpenHarmony 6.0.0)、构建模式(Debug,红色高亮)、设计风格(Android, Fuchsia or HarmonyOS)、设备类型(Mobile)、处理器核心数、系统语言、欢迎消息(Welcome to HarmonyOS!)、是否为鸿蒙系统(是)、是否为移动设备(是)、是否为 Material 设计(是)、是否为 Cupertino 设计(否)。

6.2 验证二:鸿蒙识别准确性
通过 hdc shell 验证系统返回值:
# 查看系统版本号
hdc shell param get const.ohos.os.version
# 查看 SDK API 版本
hdc shell param get const.ohos.apiversion
demo 中 platform.version 返回的值与 hdc shell param get 获取的系统版本号一致,platform.ohos 为 true,platform.operatingSystem.name 为 'HarmonyOS'——证明 vm_host_platform.dart 中的 _getOS 方法正确识别了鸿蒙系统。

6.3 验证三:条件回调匹配
demo 中 platform.when(ohos: () => 'Welcome to HarmonyOS!') 正确匹配了 ohos 回调,返回欢迎消息。platform.when(vm: ..., js: ...) 正确匹配了 vm 回调,返回 'VM (Native)'。嵌套调用 when(material: ...) 正确匹配了 material 回调——证明 when 方法的优先级链在鸿蒙上行为一致。

6.4 验证四:插件注册日志
通过 hdc hilog 抓取运行日志:
hdc shell hilog -r
hdc shell aa start -b com.example.platform_info_example -a EntryAbility
hdc shell hilog | grep PlatformInfoPlugin
日志输出确认 PlatformInfoPlugin 通过 GeneratedPluginRegistrant 注册成功,MethodChannel('platform_info') 通道就绪。getPlatformVersion 方法返回 "OpenHarmony ^ ^ "。
说明:platform_info 的核心逻辑(操作系统检测、版本读取、构建模式判断、设计风格归类、设备类型判断)全部为纯 Dart 实现,通过
dart:io标准库直接读取环境信息,不经过MethodChannel。OHOS 原生插件PlatformInfoPlugin仅提供getPlatformVersion桩实现,在实际业务中可忽略——platform.version的值来自io.Platform.operatingSystemVersion,而非原生通道。
实测结论:
以下是操作的视屏,可以参考一下:
| 验证点 | 结果 |
|---|---|
| 应用启动,Flutter 页面正常渲染十二项平台信息卡片 | 通过 |
| 操作系统显示为 HarmonyOS,橙色高亮 | 通过 |
| 构建模式显示为 Debug,红色高亮 | 通过 |
| 欢迎消息显示"Welcome to HarmonyOS!" | 通过 |
| 是否为鸿蒙系统显示"是" | 通过 |
| 是否为移动设备显示"是" | 通过 |
| 是否为 Material 设计显示"是" | 通过 |
| 全程无需申请任何敏感权限 | 通过 |
七、工作原理
整个调用链路如下:
应用启动
→ Platform._internalFactoryFromEnvironment()
→ _$getCurrentBuildMode()
→ const bool.fromEnvironment('dart.vm.product')
→ true: BuildMode.release()
→ false: assert(() { result = BuildMode.debug(); }) // Debug 执行, Profile 跳过
→ _$getHostPlatform()
→ getHostPlatform() // 条件导入: dart.library.io → vm_host_platform.dart
→ _HostPlatform$IO._()
→ _getOS()
→ io.Platform.operatingSystemVersion.toLowerCase()
→ 包含 'ohos' 或 'harmony' → OperatingSystem.ohos()
→ io.Platform.isAndroid → OperatingSystem.android()
→ io.Platform.isMacOS → OperatingSystem.macOS()
→ ...
→ _getVersion() → io.Platform.operatingSystemVersion
→ _getLocale() → io.Platform.localeName 处理后取两字符
→ _numberOfProcessors() → io.Platform.numberOfProcessors
→ 组装 mobile/desktop/material/cupertino
→ kListOSForMobile.contains(ohos) → mobile = true
→ kListOSWithMaterialDesign.contains(ohos) → material = true
→ 返回不可变 Platform 单例
用户访问 platform.ohos
→ operatingSystem.ohos
→ OperatingSystem$OHOS.ohos → true
用户调用 platform.when(ohos: () => ..., orElse: () => ...)
→ 第一优先级: 操作系统检查
→ this.ohos == true → 执行 ohos() 回调
ArkTS: PlatformInfoPlugin.onMethodCall("getPlatformVersion")
→ result.success("OpenHarmony ^ ^ ")
Dart 侧的平台信息检测全部为纯 Dart 实现,通过 dart:io 标准库读取环境信息,不经过任何平台通道。条件导入(conditional import)机制确保在 Web 环境下使用 js_host_platform.dart,在 VM 环境(包括鸿蒙)下使用 vm_host_platform.dart。
鸿蒙技术点:条件导入(Conditional Import)
platform.dart中的import 'stub_host_platform.dart' if (dart.library.js_interop) 'js_host_platform.dart' if (dart.library.io) 'vm_host_platform.dart';是 Dart 的条件导入语法。编译器按顺序检查条件:若dart.library.js_interop可用(Web 环境),导入js_host_platform.dart;若dart.library.io可用(VM 环境,包括 Android、iOS、鸿蒙、桌面),导入vm_host_platform.dart;否则导入stub_host_platform.dart作为兜底。鸿蒙环境属于 VM 环境,dart.library.io可用,因此导入vm_host_platform.dart——这就是 platform_info 在鸿蒙上无需任何适配即可工作的根本原因。
**代码逐段分析:HostPlatform I O 构造器 ∗ ∗ ‘ H o s t P l a t f o r m IO 构造器** `_HostPlatform IO构造器∗∗‘HostPlatformIO
是 VM 环境下的宿主平台实现。构造器H o s t P l a t f o r m HostPlatform HostPlatformIO._()在应用启动时被调用一次(单例模式),通过四个静态方法采集信息:_getOS()检测操作系统、_getVersion()读取版本号、_getLocale()提取语言代码、_numberOfProcessors()获取 CPU 核心数。这些方法全部通过dart:io标准库的io.Platform类读取——在鸿蒙环境中,Flutter ohos 引擎在dart:io层暴露了operatingSystemVersion字段,其值包含ohos或harmony标识,_getOS据此返回OperatingSystem.ohos()。type固定为HostPlatformType.vm()`,因为 VM 环境总是 IO 类型。
鸿蒙侧插件实现(ArkTS)核心代码:
import {
FlutterPlugin, FlutterPluginBinding, MethodCall,
MethodCallHandler, MethodChannel, MethodResult,
} from '@ohos/flutter_ohos';
export default class PlatformInfoPlugin implements FlutterPlugin, MethodCallHandler {
private channel: MethodChannel | null = null;
getUniqueClassName(): string {
return "PlatformInfoPlugin"
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), "platform_info");
this.channel.setMethodCallHandler(this)
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
if (this.channel != null) {
this.channel.setMethodCallHandler(null)
}
}
onMethodCall(call: MethodCall, result: MethodResult): void {
if (call.method == "getPlatformVersion") {
result.success("OpenHarmony ^ ^ ")
} else {
result.notImplemented()
}
}
}
说明:
PlatformInfoPlugin是一个桩实现,仅响应getPlatformVersion方法返回"OpenHarmony ^ ^ "。platform_info 的核心逻辑完全不依赖原生通道——Dart 层通过dart:io直接读取所有平台信息。原生插件的存在是为了满足 Flutter 插件注册机制的要求(pubspec.yaml中声明了ohos平台),实际业务中可忽略其返回值。
鸿蒙技术点:FlutterPlugin 与 MethodCallHandler 接口
PlatformInfoPlugin实现了FlutterPlugin和MethodCallHandler两个接口。FlutterPlugin的onAttachedToEngine在插件挂载到引擎时被调用,创建MethodChannel('platform_info')并设置自身为回调处理器;onDetachedFromEngine在卸载时清理通道并置 null。MethodCallHandler的onMethodCall处理来自 Dart 层的方法调用——收到getPlatformVersion时返回"OpenHarmony ^ ^ ",未实现的方法返回notImplemented()。
八、常见问题
Q1:platform.version 返回的字符串格式是什么?
返回 io.Platform.operatingSystemVersion 的原始值,在鸿蒙设备上通常为 "OpenHarmony 6.0.0" 或 "HarmonyOS x.x.x" 格式。该值由 Flutter ohos 引擎在 dart:io 层暴露,具体格式取决于引擎实现。若需要精确的 API 版本号,建议通过 hdc shell param get const.ohos.apiversion 获取。
Q2:如何区分 Debug、Profile、Release 三种构建模式?
使用 platform.buildMode 属性。platform.buildMode.debug 在 Debug 构建时为 true,platform.buildMode.profile 在 Profile 构建时为 true,platform.buildMode.release 在 Release 构建时为 true。也可以使用 switch (platform.buildMode) 模式匹配,Dart 3 的 sealed class 保证穷尽性检查。检测原理利用了 assert 语句仅在 Debug 模式执行的特性。
Q3:真机安装 demo 时提示"此应用暂不支持在当前设备安装"?
这是宿主工程的 compatibleSdkVersion 高于真机 API 版本导致的安装校验失败,与插件无关。将 build-profile.json5 中的 compatibleSdkVersion 调整为不高于真机 API 的版本(如 5.0.0(12),注意保留带括号的旧格式)即可。本文配套仓库的 example 已用此配置在 OpenHarmony-6.0.0.115 SP16 真机上安装实测通过。
Q4:platform_info 是否依赖原生插件?
不依赖。platform_info 的核心逻辑(操作系统检测、版本读取、构建模式判断、设计风格归类、设备类型判断)全部为纯 Dart 实现,通过 dart:io 标准库读取环境信息,不经过 MethodChannel。pubspec.yaml 中声明了 ohos 平台支持并提供了 PlatformInfoPlugin 原生桩实现,但这仅是为了满足 Flutter 插件注册机制——实际业务中 platform 单例的所有属性都可以在鸿蒙上直接使用,无需原生插件参与。
Q5:为什么鸿蒙被归类为 Material 设计?
constants.dart 中的 kListOSWithMaterialDesign 集合包含 OperatingSystem.ohos(),因此 platform.material 为 true。这是基于 HarmonyOS 的 UI 风格定位——鸿蒙系统的原生 UI 组件风格偏向 Material Design(卡片、涟漪效果、FAB 等),与 Android 和 Fuchsia 归为同一阵营。若业务需要使用 Cupertino 风格组件,可通过 platform.when(cupertino: ..., material: ...) 分支处理。
Q6:Web 环境下如何检测操作系统?
Web 环境下使用 js_host_platform.dart,通过 web.window.navigator.userAgent 字符串匹配关键字(fuchsia、mac、win、android、iphone、ios、linux)识别操作系统。Web 环境不支持检测鸿蒙——浏览器 user agent 中不包含鸿蒙标识。若需要在 Web 端检测鸿蒙设备,需通过其他方式(如自定义 user agent 或服务端检测)。
九、结语
回顾一下:在 pubspec.yaml 中以 git TAG 引入 platform_info,通过 platform 单例即可在鸿蒙 App 内获取操作系统(HarmonyOS)、系统版本、构建模式、设计风格(Material)、设备类型(Mobile)、处理器核心数、系统语言等全套运行环境信息。when 回调方法支持按优先级链做条件分支,switch 模式匹配支持穷尽性检查。核心逻辑全部为纯 Dart 实现,通过 dart:io 标准库直接读取环境信息,在 Android、iOS、鸿蒙、Windows、macOS、Linux、Web 七端行为完全一致;OHOS 原生插件仅提供桩实现,零权限、零侵入。已在 OpenHarmony-6.0.0.115 SP16 真机完整实测,十二项平台信息全部正确获取。
使用中发现任何问题,欢迎到配套仓库提 Issue,也欢迎发 PR 共建。
相关链接
欢迎加入 CPF-Flutter 鸿蒙社区,社区入口、环境搭建指南和本文相关链接统一放在这里:
附:platform_info 核心能力对照表
| 能力维度 | 实现方式 | 鸿蒙表现 | 跨平台一致性 |
|---|---|---|---|
| 操作系统检测 | io.Platform.operatingSystemVersion 字符串匹配 | 识别为 OperatingSystem.ohos() | 七端均有对应枚举值 |
| 系统版本 | io.Platform.operatingSystemVersion | "OpenHarmony 6.0.0" | 各端返回对应版本字符串 |
| 构建模式 | dart.vm.product + assert 副作用 | Debug/Profile/Release 三态 | 七端完全一致 |
| 系统语言 | io.Platform.localeName 处理后取两字符 | 如 zh / en | 七端完全一致 |
| 处理器核心数 | io.Platform.numberOfProcessors | 如 8 | VM 端一致,Web 端用 navigator.hardwareConcurrency |
| 设备类型 | kListOSForMobile / kListOSForDesktop 集合包含判断 | mobile = true, desktop = false | 七端完全一致 |
| 设计风格 | kListOSWithMaterialDesign / kListOSWithCupertinoDesign | material = true, cupertino = false | 七端完全一致 |
| 条件回调 | platform.when() 优先级链 | ohos 回调被匹配 | 七端完全一致 |
| 模式匹配 | Dart 3 switch + sealed class | 穷尽性检查 | 七端完全一致 |
| 条件导入 | if (dart.library.io) vm_host_platform.dart | 导入 VM 实现 | VM 端导入 vm,Web 端导入 js |
| 平台版本(桩) | MethodChannel('platform_info') | "OpenHarmony ^ ^ " | 格式对齐各平台 |
| 权限要求 | 无 | 无敏感权限 | 七端均无 |
更多推荐




所有评论(0)