开发工具: 华为云码道

本文配套仓库: CPF-Flutter/fluttertpc_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 设计显示"是"通过
全程无需申请任何敏感权限通过

KeyHash 示例页 真机运行效果 真机运行效果

鸿蒙技术点: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:ioPlatform 类读取环境信息,不依赖任何平台 API,逻辑在六端完全一致;
  • 零权限:所有信息来源于 Dart 运行时环境与 dart:io 标准库,OHOS 平台桩仅返回版本字符串,不需要在 module.json5 中申请任何敏感权限;
  • 鸿蒙原生识别vm_host_platform.dart 中通过 io.Platform.operatingSystemVersion 字符串包含 ohosharmony 来识别鸿蒙系统,返回 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 枚举值
枚举值namemobilematerialdesktopcupertino
OperatingSystem.android()Androidtruetruefalsefalse
OperatingSystem.ios()iOStruefalsefalsetrue
OperatingSystem.ohos()HarmonyOStruetruefalsefalse
OperatingSystem.macOS()macOSfalsefalsetruetrue
OperatingSystem.windows()Windowsfalsefalsetruefalse
OperatingSystem.linux()Linuxfalsefalsetruefalse
OperatingSystem.fuchsia()Fuchsiafalsetruetruefalse
OperatingSystem.unknown()Unknownfalsefalsefalsefalse

三、环境准备

本文所有实测均在以下环境完成:

版本说明
Flutter(ohos 版)3.27.5-ohos-1.0.1主验证环境,真机实测
编译 SDK5.0.0(12)宿主工程 compatibleSdkVersion 同值,保留带括号的旧格式
DevEco Studio6.0.1.251构建环境
真机OpenHarmony-6.0.0.115 SP16API 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.355.0.0-ohos-1.0.0master

说明:该 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.instancePlatform.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 处理后取两字符语言代码(如 zhen)。numberOfProcessors 来自 io.Platform.numberOfProcessors,返回设备 CPU 的逻辑核心数。

代码逐段分析:_getLocale 语言代码提取
_getLocale 方法从 io.Platform.localeName 中提取语言代码。鸿蒙系统返回的 locale 格式可能为 zh-CNzh_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$DebugBuildMode$ProfileBuildMode$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 中被跳过),在回调中将 resultBuildMode.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$AndroidOperatingSystem$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,而非原生通道。

实测结论:

以下是操作的视屏,可以参考一下:

Example 启动授权

验证点结果
应用启动,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字段,其值包含ohosharmony 标识,_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 实现了 FlutterPluginMethodCallHandler 两个接口。FlutterPluginonAttachedToEngine 在插件挂载到引擎时被调用,创建 MethodChannel('platform_info') 并设置自身为回调处理器;onDetachedFromEngine 在卸载时清理通道并置 null。MethodCallHandleronMethodCall 处理来自 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 标准库读取环境信息,不经过 MethodChannelpubspec.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 字符串匹配关键字(fuchsiamacwinandroidiphoneioslinux)识别操作系统。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如 8VM 端一致,Web 端用 navigator.hardwareConcurrency
设备类型kListOSForMobile / kListOSForDesktop 集合包含判断mobile = true, desktop = false七端完全一致
设计风格kListOSWithMaterialDesign / kListOSWithCupertinoDesignmaterial = 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 ^ ^ "格式对齐各平台
权限要求无敏感权限七端均无
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐