鸿蒙 HarmonyOS+Flutter 跨端开发实战:从环境搭建到应用上线

前言

随着跨端开发技术的普及,开发者们越来越追求 “一套代码、多端运行” 的高效开发模式。华为鸿蒙 HarmonyOS 作为面向万物互联的分布式操作系统,与 Flutter(谷歌推出的跨平台 UI 框架)的结合,能兼顾鸿蒙系统的分布式能力和 Flutter 的高性能 UI 渲染优势,成为跨端开发的新选择。

本文将从环境搭建、项目初始化、核心功能开发、鸿蒙适配优化到应用打包上线,全方位讲解鸿蒙 + Flutter 的开发流程,全程附带可直接运行的代码示例和官方文档链接,适合有一定 Flutter 基础、想要拓展鸿蒙开发的开发者学习。

一、鸿蒙 + Flutter 开发基础认知

1.1 技术适配原理

Flutter 通过自绘引擎 Skia 实现跨平台 UI 渲染,而鸿蒙 HarmonyOS 提供了对 Flutter 的官方适配支持:

  • 鸿蒙系统通过Flutter Engine接入层,将 Flutter 的 UI 渲染指令映射到鸿蒙的 ArkUI 组件体系;
  • 鸿蒙的分布式能力(如数据流转、设备发现)可通过 Flutter 插件(MethodChannel)与 Flutter 业务层交互;
  • 官方适配文档:HarmonyOS 对接 Flutter 技术指南

1.2 开发优势

  • 跨端覆盖:一套 Flutter 代码可同时运行在鸿蒙(手机 / 平板 / 智慧屏)、Android、iOS,减少多端开发成本;
  • 性能保障:Flutter 自绘 UI 避免鸿蒙原生组件的跨平台适配损耗,帧率稳定在 60fps;
  • 生态兼容:鸿蒙支持 Flutter 官方插件市场(pub.dev)的大部分插件,同时可通过鸿蒙原生能力扩展 Flutter 功能。

二、开发环境搭建(附详细步骤 + 避坑指南)

2.1 环境依赖清单

依赖项 版本要求 官方下载链接
JDK 11+ Oracle JDK11 下载
DevEco Studio 4.1+ DevEco Studio 官方下载
Flutter SDK 3.10+ Flutter SDK 官方下载
Node.js 16+ Node.js 官方下载

2.2 环境配置步骤

步骤 1:安装 DevEco Studio 并配置鸿蒙 SDK
  1. 下载 DevEco Studio 后,运行安装包,选择自定义安装,勾选 “HarmonyOS SDK” 和 “Android SDK”;
  2. 打开 DevEco Studio,进入File > Settings > Appearance & Behavior > System Settings > HarmonyOS SDK,下载 API 9/10 版本的 SDK(推荐 API 10);
  3. 配置环境变量:

    bash

    运行

    # Windows系统(环境变量-系统变量)
    HARMONY_SDK_HOME=D:\DevEcoStudio\sdk
    PATH=%HARMONY_SDK_HOME%\toolchains\latest\bin;%PATH%
    
    # Mac/Linux系统(~/.bash_profile或~/.zshrc)
    export HARMONY_SDK_HOME=/Users/xxx/DevEcoStudio/sdk
    export PATH=$HARMONY_SDK_HOME/toolchains/latest/bin:$PATH
    
步骤 2:安装 Flutter SDK 并配置鸿蒙适配
  1. 下载 Flutter SDK 后解压,配置 Flutter 环境变量:

    运行

    # Windows
    FLUTTER_HOME=D:\flutter
    PATH=%FLUTTER_HOME%\bin;%PATH%
    
    # Mac/Linux
    export FLUTTER_HOME=/Users/xxx/flutter
    export PATH=$FLUTTER_HOME/bin:$PATH
    
  2. 执行flutter doctor检查环境,修复缺失依赖(如 Android license、DevEco Studio 插件);
  3. 安装鸿蒙 Flutter 插件:
步骤 3:验证环境

执行以下命令,若输出 “HarmonyOS device connected” 则环境配置成功:

运行

# 检查Flutter与鸿蒙适配状态
flutter devices
# 检查Flutter版本
flutter --version

2.3 常见坑点解决

  1. 问题:flutter doctor提示 “HarmonyOS SDK not found”解决:手动指定鸿蒙 SDK 路径:flutter config --harmony-sdk-path <你的HARMONY_SDK_HOME>
  2. 问题:DevEco Studio 无法识别 Flutter SDK解决:进入File > Settings > Languages & Frameworks > Flutter,手动选择 Flutter SDK 解压路径。

三、鸿蒙 + Flutter 项目初始化与目录解析

3.1 创建第一个鸿蒙 Flutter 项目

方式 1:通过 DevEco Studio 创建
  1. 打开 DevEco Studio,选择Create New Project
  2. 选择 “Flutter” > “HarmonyOS”,填写项目信息:
    • Project name: flutter_harmony_demo
    • Package name: com.example.flutter_harmony_demo
    • Save location: 自定义路径
  3. 点击 “Finish”,等待项目依赖下载完成。
方式 2:通过 Flutter 命令行创建

运行

# 创建鸿蒙Flutter项目
flutter create --platforms=harmony flutter_harmony_demo
# 进入项目目录
cd flutter_harmony_demo
# 运行项目(连接鸿蒙模拟器/真机)
flutter run

3.2 项目目录核心结构解析

flutter_harmony_demo/
├── android/           # Android端配置(可忽略,专注鸿蒙)
├── harmony/           # 鸿蒙核心配置目录(重点)
│   ├── entry/         # 鸿蒙应用入口模块
│   │   ├── src/main/
│   │   │   ├── ets/   # 鸿蒙ETS代码(Flutter容器配置)
│   │   │   ├── resources/ # 鸿蒙资源文件
│   │   │   └── config.json # 鸿蒙应用配置
│   └── oh-package.json # 鸿蒙依赖配置
├── lib/               # Flutter业务代码(核心)
│   ├── main.dart      # Flutter入口文件
│   ├── pages/         # Flutter页面
│   └── utils/         # 工具类
├── pubspec.yaml       # Flutter依赖配置
└── README.md

3.3 第一个 Hello World 示例

步骤 1:修改 Flutter 入口文件(lib/main.dart)
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '鸿蒙Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        // 适配鸿蒙系统深色模式
        brightness: MediaQuery.platformBrightnessOf(context),
      ),
      home: const MyHomePage(title: '鸿蒙Flutter首页'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  // 计数方法
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        // 适配鸿蒙系统状态栏
        systemOverlayStyle: SystemUiOverlayStyle.light,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '你已点击按钮次数:',
              style: TextStyle(fontSize: 18),
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.displayMedium,
            ),
            // 鸿蒙特色按钮样式
            Padding(
              padding: const EdgeInsets.only(top: 20),
              child: ElevatedButton(
                style: ElevatedButton.styleFrom(
                  backgroundColor: Color(0xFF007DFF), // 鸿蒙蓝
                  padding: EdgeInsets.symmetric(horizontal: 30, vertical: 12),
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(8),
                  ),
                ),
                onPressed: _incrementCounter,
                child: const Text('点击计数', style: TextStyle(fontSize: 16)),
              ),
            )
          ],
        ),
      ),
    );
  }
}
步骤 2:配置鸿蒙 Flutter 容器(harmony/entry/src/main/ets/AbilityStage.ts)

运行

import AbilityStage from '@ohos.app.ability.AbilityStage';
import { FlutterAbility } from '@flutter/flutter_ohos';

export default class MyAbilityStage extends AbilityStage {
  onCreate(): void {
    super.onCreate();
    // 初始化Flutter Ability
    FlutterAbility.init(this.context);
  }
}
步骤 3:运行项目

运行

# 启动鸿蒙模拟器(或连接真机)
# 运行Flutter项目
flutter run --device-id <鸿蒙设备ID>

运行成功后,鸿蒙模拟器会显示带有计数按钮的 Flutter 页面,点击按钮可实现计数功能。

四、核心功能开发:鸿蒙能力与 Flutter 交互

4.1 鸿蒙原生能力调用(MethodChannel)

Flutter 通过 MethodChannel 实现与鸿蒙原生代码的通信,以下示例实现 “调用鸿蒙系统通知功能”。

步骤 1:Flutter 端代码(lib/utils/harmony_channel.dart)
import 'package:flutter/services.dart';

class HarmonyChannel {
  // 定义MethodChannel,名称需与鸿蒙端一致
  static const MethodChannel _channel =
      MethodChannel('com.example.flutter_harmony_demo/harmony_channel');

  // 调用鸿蒙原生通知
  static Future<void> showHarmonyNotification({
    required String title,
    required String content,
  }) async {
    try {
      await _channel.invokeMethod('showNotification', {
        'title': title,
        'content': content,
      });
      print('鸿蒙通知发送成功');
    } on PlatformException catch (e) {
      print('鸿蒙通知发送失败:${e.message}');
    }
  }
}
步骤 2:鸿蒙端代码(harmony/entry/src/main/ets/flutter/FlutterMethodChannel.ts)

运行

import { FlutterMethodChannel } from '@flutter/flutter_ohos';
import notification from '@ohos.notificationManager';
import { BusinessError } from '@ohos.base';

// 注册MethodChannel
export function registerHarmonyChannel() {
  const channel = new FlutterMethodChannel('com.example.flutter_harmony_demo/harmony_channel');
  channel.setMethodCallHandler((methodName: string, params: any) => {
    switch (methodName) {
      case 'showNotification':
        showNotification(params.title, params.content);
        break;
      default:
        console.log('未知方法:', methodName);
    }
  });
}

// 鸿蒙原生通知实现
function showNotification(title: string, content: string) {
  // 创建通知请求
  const notificationRequest = {
    id: 1,
    content: {
      contentType: notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
      normal: {
        title: title,
        text: content,
        additionalText: 'Flutter调用鸿蒙通知'
      }
    },
    deliveryTime: new Date().getTime(),
    slotType: notification.SlotType.SLOT_SERVICE
  };

  // 发送通知
  notification.publish(notificationRequest, (err: BusinessError) => {
    if (err) {
      console.error('通知发送失败:', err.message);
      return;
    }
    console.log('通知发送成功');
  });
}
步骤 3:在 Flutter 页面中调用

修改lib/main.dart_incrementCounter方法:

void _incrementCounter() {
  setState(() {
    _counter++;
    // 调用鸿蒙通知
    HarmonyChannel.showHarmonyNotification(
      title: '计数更新',
      content: '当前计数:$_counter',
    );
  });
}

4.2 鸿蒙分布式数据流转(Flutter 侧适配)

鸿蒙的分布式能力是核心优势,以下示例实现 “多设备数据同步”(需开启鸿蒙设备的分布式能力)。

步骤 1:添加鸿蒙分布式依赖(harmony/entry/oh-package.json)
{
  "name": "entry",
  "version": "1.0.0",
  "dependencies": {
    "@ohos.distributedData": "2.0.0",
    "@flutter/flutter_ohos": "1.0.0"
  }
}
步骤 2:鸿蒙端分布式数据管理(harmony/entry/src/main/ets/utils/DistributedData.ts)

运行

import distributedData from '@ohos.distributedData';

// 创建分布式数据存储
const kvManagerConfig = {
  bundleName: 'com.example.flutter_harmony_demo',
  userInfo: {
    userId: '0',
    userType: distributedData.UserType.SYSTEM
  }
};

let kvManager: distributedData.KVManager | null = null;
let kvStore: distributedData.KVStore | null = null;

// 初始化分布式存储
export async function initDistributedKVStore() {
  try {
    kvManager = await distributedData.createKVManager(kvManagerConfig);
    const kvStoreConfig = {
      storeId: 'flutter_harmony_kvstore',
      securityLevel: distributedData.SecurityLevel.S1,
      encrypt: false,
      syncable: true // 开启跨设备同步
    };
    kvStore = await kvManager.getKVStore(kvStoreConfig);
    console.log('分布式存储初始化成功');
  } catch (e) {
    console.error('分布式存储初始化失败:', e);
  }
}

// 写入数据
export function putDistributedData(key: string, value: any) {
  if (kvStore) {
    kvStore.put(key, value).then(() => {
      console.log(`写入数据:${key}=${value}`);
    }).catch((err) => {
      console.error('写入失败:', err);
    });
  }
}

// 读取数据
export function getDistributedData(key: string, callback: (value: any) => void) {
  if (kvStore) {
    kvStore.get(key).then((value) => {
      callback(value);
    }).catch((err) => {
      console.error('读取失败:', err);
      callback(null);
    });
  }
}
步骤 3:Flutter 端调用分布式能力

修改harmony_channel.dart,添加分布式数据方法:

// 写入分布式数据
static Future<void> putDistributedData(String key, dynamic value) async {
  try {
    await _channel.invokeMethod('putDistributedData', {
      'key': key,
      'value': value,
    });
  } on PlatformException catch (e) {
    print('写入分布式数据失败:${e.message}');
  }
}

// 读取分布式数据
static Future<dynamic> getDistributedData(String key) async {
  try {
    return await _channel.invokeMethod('getDistributedData', {
      'key': key,
    });
  } on PlatformException catch (e) {
    print('读取分布式数据失败:${e.message}');
    return null;
  }
}

在鸿蒙端FlutterMethodChannel.ts中添加对应方法:

运行

case 'putDistributedData':
  putDistributedData(params.key, params.value);
  break;
case 'getDistributedData':
  getDistributedData(params.key).then((value) => {
    channel.invokeMethod('onDistributedDataResult', value);
  });
  break;

五、鸿蒙 Flutter 应用优化

与适配

5.1 UI 适配鸿蒙多设备

鸿蒙支持手机、平板、智慧屏等多设备,Flutter 需做响应式适配:

// lib/utils/responsive_layout.dart
import 'package:flutter/material.dart';

class ResponsiveLayout {
  // 判断设备类型
  static bool isPhone(BuildContext context) =>
      MediaQuery.of(context).size.width < 600;

  static bool isTablet(BuildContext context) =>
      MediaQuery.of(context).size.width >= 600 &&
      MediaQuery.of(context).size.width < 1200;

  static bool isTV(BuildContext context) =>
      MediaQuery.of(context).size.width >= 1200;

  // 响应式字体大小
  static double getFontSize(BuildContext context, double baseSize) {
    if (isTV(context)) {
      return baseSize * 2;
    } else if (isTablet(context)) {
      return baseSize * 1.5;
    }
    return baseSize;
  }
}

使用示例:

Text(
  '$_counter',
  style: TextStyle(
    fontSize: ResponsiveLayout.getFontSize(context, 24),
    fontWeight: FontWeight.bold,
  ),
)

5.2 性能优化技巧

  1. 减少 UI 重绘:使用const构造函数、ValueNotifier替代setState
  2. 鸿蒙资源复用:将图片、字体等资源放在鸿蒙resources目录,通过 Flutter 加载;
  3. 懒加载:使用ListView.builder替代ListView,避免一次性渲染大量组件;
  4. 官方性能优化文档:HarmonyOS Flutter 性能优化指南

六、应用打包与鸿蒙应用市场上线

6.1 打包鸿蒙 HAP 包

步骤 1:配置签名信息
  1. 在 DevEco Studio 中,进入Build > Generate Signed Bundle / HAP
  2. 创建新的签名证书(或使用已有证书),填写证书信息;
  3. 选择 “Release” 模式,勾选 “HarmonyOS” 平台。
步骤 2:执行打包命令

运行

# Flutter端打包
flutter build harmony --release
# 鸿蒙端打包(DevEco Studio)
# Build > Build HAP(s) / APP(s) > Build HAP(s)

打包完成后,在build/harmony/release目录下生成 HAP 包。

6.2 鸿蒙应用市场上线流程

  1. 注册华为开发者账号:华为开发者平台
  2. 创建应用:进入 “AppGallery Connect” > “我的应用” > “创建应用”;
  3. 上传 HAP 包:填写应用信息(名称、描述、截图),上传打包好的 HAP 包;
  4. 提交审核:等待华为应用市场审核(约 1-3 个工作日);
  5. 上线发布:审核通过后,选择发布范围(全网 / 分区域)。

官方上线文档:HarmonyOS 应用上架指南

七、总结与拓展

7.1 核心知识点回顾

  1. 鸿蒙 + Flutter 的适配原理是通过 Flutter Engine 接入层实现 UI 渲染和能力交互;
  2. 环境搭建需重点配置 DevEco Studio 和 Flutter SDK 的路径关联;
  3. 通过 MethodChannel 可实现 Flutter 与鸿蒙原生能力的双向调用;
  4. 适配鸿蒙多设备需做响应式 UI 设计,兼顾性能优化;
  5. 打包上线需遵循鸿蒙应用市场的规范。

7.2 拓展学习资源

  1. Flutter 官方文档:Flutter 中文网
  2. 鸿蒙 Flutter 开发示例:华为鸿蒙 Flutter 示例仓库
  3. 鸿蒙分布式能力文档:HarmonyOS 分布式数据管理
  4. Flutter 插件开发:Flutter 插件开发指南

7.3 未来展望

鸿蒙 4.0 + 版本对 Flutter 的支持进一步升级,新增了对 Flutter 3.16 + 版本的适配,同时开放了更多鸿蒙原生能力(如原子化服务、超级终端)。开发者可基于本文的基础,探索更多场景:

  • 鸿蒙原子化服务 + Flutter 快速入口开发;
  • 鸿蒙超级终端 + Flutter 多设备协同;
  • Flutter + 鸿蒙 ArkTS 混合开发。

附录:完整代码仓库

本文所有示例代码已上传至 Gitee 仓库,可直接克隆运行:鸿蒙 Flutter 实战示例仓库(替换为实际仓库地址)

欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐