Flutter鸿蒙适配实战_从Flutter到HarmonyOS

5 阅读4分钟

Flutter 鸿蒙适配实战:从 Flutter 到 HarmonyOS Next

华为 HarmonyOS Next 已不再兼容安卓 APK,Flutter 作为跨平台框架需要单独适配。本文系统梳理 Flutter 鸿蒙适配的核心思路和落地步骤。


一、背景与现状

1.1 HarmonyOS Next 的变化

项目AndroidHarmonyOS Next
应用格式APK / AABHAP / APP
运行时ARTArkTS Runtime
原生语言Java / KotlinArkTS(基于 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 对比

维度FlutterArkUI-X
UI 渲染Skia 引擎ArkUI 引擎
开发语言DartArkTS(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 权限鸿蒙权限
INTERNETohos.permission.INTERNET
CAMERAohos.permission.CAMERA
READ_CONTACTSohos.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)
onCreateonCreate
onStartonWindowStageCreate
onResumeonForeground
onPauseonBackground
onStoponWindowStageDestroy
onDestroyonDestroy

六、实用适配建议

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 鸿蒙适配是当前跨平台开发的热门话题,如果本文对你有帮助,欢迎点赞收藏。如有疑问,欢迎在评论区交流。