Flutter 鸿蒙适配实战:从 Flutter 到 HarmonyOS Next
华为 HarmonyOS Next 已不再兼容安卓 APK,Flutter 作为跨平台框架需要单独适配。本文系统梳理 Flutter 鸿蒙适配的核心思路和落地步骤。
一、背景与现状
1.1 HarmonyOS Next 的变化
| 项目 | Android | HarmonyOS Next |
|---|---|---|
| 应用格式 | APK / AAB | HAP / APP |
| 运行时 | ART | ArkTS Runtime |
| 原生语言 | Java / Kotlin | ArkTS(基于 TypeScript) |
| 兼容性 | - | 不兼容 APK |
1.2 Flutter 对鸿蒙的支持现状
- Flutter 官方尚未正式支持 HarmonyOS
- 社区有第三方适配方案(
flutter_harmony等) - 华为提供了
ArkUI-X跨平台框架(类似 Flutter 思路) - 可通过 Platform Channel 调用鸿蒙原生能力
二、方案一:使用社区 Flutter 鸿蒙适配(推荐尝试)
2.1 环境准备
# 1. 安装鸿蒙 Flutter SDK(社区版本)
# 参考:https://gitcode.net/openharmony-sig/flutter_flutter
git clone https://gitcode.net/openharmony-sig/flutter_flutter.git
cd flutter_flutter
git checkout -b dev origin/dev
# 2. 配置环境变量
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
# 3. 安装鸿蒙 SDK(需要 DevEco Studio)
# 从华为开发者联盟下载 DevEco Studio
# 4. 验证环境
flutter doctor
2.2 创建鸿蒙 Flutter 项目
# 使用社区版本的 Flutter 命令
flutter create --platforms=ohos my_harmony_app
cd my_harmony_app
# 运行到鸿蒙设备
flutter run -d <harmony_device_id>
项目结构差异:
my_harmony_app/
├── lib/ # Dart 代码(共享)
├── android/ # Android 平台代码
├── ios/ # iOS 平台代码
├── ohos/ # 鸿蒙平台代码(新增)
│ ├── AppScope/
│ ├── entry/
│ └── oh-package.json5
└── pubspec.yaml
三、方案二:ArkUI-X(华为官方跨平台方案)
华为推出的 ArkUI-X 支持使用 ArkTS 开发跨平台应用(Android/iOS/鸿蒙)。
3.1 ArkUI-X 与 Flutter 对比
| 维度 | Flutter | ArkUI-X |
|---|---|---|
| UI 渲染 | Skia 引擎 | ArkUI 引擎 |
| 开发语言 | Dart | ArkTS(TypeScript 扩展) |
| 生态 | 成熟、插件丰富 | 初期、插件较少 |
| 鸿蒙支持 | 社区方案 | 官方原生支持 |
| 跨平台 | Android/iOS/Web/桌面 | Android/iOS/鸿蒙 |
3.2 ArkUI-X 基本使用
# 安装 ArkUI-X CLI
npm install -g @ohos/arkui-x-cli
# 创建项目
arkuix create my-app
cd my-app
# 运行到各平台
arkuix run android
arkuix run ios
arkuix run harmony
四、Platform Channel:Flutter 与鸿蒙原生通信
即使使用社区 Flutter 鸿蒙方案,也需要通过 Platform Channel 调用鸿蒙原生能力。
4.1 Flutter 端代码
// 定义与鸿蒙通信的 MethodChannel
import 'package:flutter/services.dart';
class HarmonyApi {
static const _channel = MethodChannel('com.example.app/harmony');
// 获取鸿蒙系统版本
static Future<String> getHarmonyVersion() async {
try {
final result = await _channel.invokeMethod<String>('getHarmonyVersion');
return result ?? 'unknown';
} on PlatformException catch (e) {
print('调用失败:${e.message}');
return 'unknown';
}
}
// 调用鸿蒙原生 UI 组件
static Future<void> showToast(String message) async {
try {
await _channel.invokeMethod('showToast', {'message': message});
} on PlatformException catch (e) {
print('调用失败:${e.message}');
}
}
}
4.2 鸿蒙端代码(ArkTS)
// ohos/entry/src/main/ets/MainAbility/MainAbility.ets
import Ability from '@ohos.application.Ability';
import AbilityConstant from '@ohos.application.AbilityConstant';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
// 注册 MethodChannel 处理
export default class MainAbility extends Ability {
private messageChannel: any = null;
onWindowStageCreate(windowStage: window.WindowStage) {
// 设置 Flutter 引擎
// ...
// 注册 MethodChannel
this.setupMethodChannel();
}
private setupMethodChannel() {
// 鸿蒙端接收 Flutter 调用
// 具体实现取决于使用的 Flutter 鸿蒙适配方案
// 以下为伪代码,需根据实际情况调整
// FlutterEngine.setMethodCallHandler((call, result) => {
// if (call.method === 'getHarmonyVersion') {
// const version = deviceInfo.version;
// result.success(version);
// } else if (call.method === 'showToast') {
// const message = call.argument('message');
// // 显示 Toast
// result.success(null);
// } else {
// result.notImplemented();
// }
// });
}
}
五、鸿蒙适配的关键差异
5.1 权限体系差异
| Android 权限 | 鸿蒙权限 |
|---|---|
INTERNET | ohos.permission.INTERNET |
CAMERA | ohos.permission.CAMERA |
READ_CONTACTS | ohos.permission.READ_CONTACTS |
鸿蒙权限声明(module.json5):
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "需要访问摄像头",
"usedScene": {
"abilities": ["MainAbility"],
"when": "inuse"
}
}
]
}
}
5.2 UI 适配差异
鸿蒙使用 ArkUI 作为 UI 框架,与 Flutter 的 Widget 树概念类似但语法不同:
// ArkUI(ArkTS)示例
@Entry
@Component
struct Index {
@State message: string = 'Hello HarmonyOS';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('点击我')
.onClick(() => {
this.message = 'Hello Flutter + HarmonyOS!';
})
}
.width('100%')
}
.height('100%')
}
}
5.3 生命周期差异
| Flutter / Android | 鸿蒙(Ability) |
|---|---|
onCreate | onCreate |
onStart | onWindowStageCreate |
onResume | onForeground |
onPause | onBackground |
onStop | onWindowStageDestroy |
onDestroy | onDestroy |
六、实用适配建议
6.1 代码分层,减少平台差异影响
// 抽象平台差异
abstract class PlatformService {
Future<String> getPlatformVersion();
Future<String> getHarmonyVersion();
}
// Android 实现
class AndroidPlatformService implements PlatformService {
@override
Future<String> getPlatformVersion() async {
final version = await methodChannel.invokeMethod<String>('getAndroidVersion');
return version ?? 'unknown';
}
@override
Future<String> getHarmonyVersion() async => 'not harmony';
}
// 鸿蒙实现(社区方案)
class HarmonyPlatformService implements PlatformService {
@override
Future<String> getPlatformVersion() async => 'not android';
@override
Future<String> getHarmonyVersion() async {
final version = await methodChannel.invokeMethod<String>('getHarmonyVersion');
return version ?? 'unknown';
}
}
// 根据平台选择实现
PlatformService getPlatformService() {
if (Platform.isAndroid) {
return AndroidPlatformService();
} else if (Platform.isIOS) {
return IOSPlatformService();
} else {
// 鸿蒙设备(通过判断是否存在特定字段)
return HarmonyPlatformService();
}
}
6.2 使用条件导入处理平台差异
// platform_service.dart(抽象接口)
abstract class PlatformService {
Future<String> getPlatformVersion();
}
// platform_service_android.dart(Android 实现)
class PlatformService implements PlatformService {
Future<String> getPlatformVersion() async => 'Android';
}
// platform_service_harmony.dart(鸿蒙实现)
class PlatformService implements PlatformService {
Future<String> getPlatformVersion() async => 'HarmonyOS';
}
// 使用条件导入
import 'platform_service.dart';
import 'platform_service_android.dart' if (dart.library.io) 'platform_service_harmony.dart' as platform;
void main() {
final service = platform.PlatformService();
print(service.getPlatformVersion());
}
七、当前限制与未来展望
7.1 当前限制
- 社区 Flutter 鸿蒙方案不够成熟,可能存在兼容性问题
- 部分 Flutter 插件不支持鸿蒙(需要自行适配)
- DevEco Studio 和 Flutter 工具链集成不够流畅
- 鸿蒙设备的 Flutter 调试体验有待提升
7.2 未来展望
- 华为持续推进 ArkUI-X,未来可能成为鸿蒙跨平台首选
- Flutter 官方有可能在未来版本中正式支持鸿蒙
- 随着鸿蒙生态发展,更多第三方插件会主动适配鸿蒙
八、参考资源
Flutter 鸿蒙适配是当前跨平台开发的热门话题,如果本文对你有帮助,欢迎点赞收藏。如有疑问,欢迎在评论区交流。