Files
kitchen/packages/Flutter包鸿蒙适配通用指南.md
Developer 4ec348b28e feat: 更新鸿蒙应用配置与功能优化
- 添加鸿蒙分层图标配置和生成脚本
- 修复数据导出JSON解析问题
- 优化关于页面和团队信息展示
- 更新应用版本至1.4.1
- 清理代码警告和冗余文件
- 添加字体和二维码测试脚本
- 完善鸿蒙适配文档和指南
2026-04-25 09:52:06 +08:00

240 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Flutter 包鸿蒙适配指南
> 文档创建: 2026-04-25 | 最后更新: 2026-04-25
> 适用对象: 所有需要在 HarmonyOS 上使用 Flutter 第三方包的开发者
> 核心原则: **纯Dart包零适配原生插件需ets实现**
---
## 一、核心结论(先看这个)
| 包类型 | 需要做什么 | ohos目录 |
|--------|-----------|---------|
| 🟢 **纯 Dart 包** | 仅改版本号后缀 `-ohos.1` | ❌ **禁止创建!** |
| 🔴 **原生插件** | 写 ets 原生代码 + DevEco Studio 打 har | ✅ 必须有 |
> ⛔ **最重要的一条规则**: 纯 Dart 包绝对不能创建 `ohos/` 目录!
> Flutter 引擎启动时会扫描所有 ohos 模块并 copyResource
> 空壳模块引用不存在的 `libs/flutter.har` → 直接崩溃(错误码 9001005
---
## 二、如何判断包类型
### 2.1 快速判断
```
打开包根目录,检查以下三项:
├── 是否有 android/ 或 ios/ 目录?
│ ├── 无 → 🟢 纯Dart包 → 跳到第三章
│ └── 有 → 继续判断
├── pubspec.yaml 中是否有 flutter.plugin 配置?
│ ├── 无 → 🟢 纯Dart包有平台目录但无插件声明→ 跳到第三章
│ └── 有 → 🔴 原生插件 → 跳到第四章
└── 代码中是否使用了 MethodChannel / EventChannel / FFI
├── 无 → 🟢 纯Dart包 → 跳到第三章
└── 有 → 🔴 原生插件 → 跳到第四章
```
### 2.2 判断对照表
| 检查项 | 🟢 纯 Dart 包 | 🔴 原生插件 |
|--------|-------------|-----------|
| `android/` 目录 | ❌ 无 | ✅ 有 |
| `ios/` 目录 | ❌ 无 | ✅ 有 |
| `flutter.plugin` 声明 | ❌ 无 | ✅ 有 |
| MethodChannel 使用 | ❌ 无 | ✅ 有 |
| EventChannel 使用 | ❌ 无 | ✅ 有 |
| FFI (dart:ffi) 使用 | ❌ 无 | ✅ 有 |
| 典型例子 | fl_chart, badges, qr, mailer | mobile_scanner, file_picker, camera |
### 2.3 常见纯 Dart 包类别
这些类型的包 **100% 是纯 Dart**,无需任何原生适配:
| 类别 | 代表包 | 说明 |
|------|--------|------|
| UI 组件 | fl_chart, badges, card_swiper | 纯 Widget 渲染 |
| 布局组件 | staggered_grid_view | 纯布局算法 |
| 图片处理 | cached_network_image | 网络+缓存(条件导入) |
| 文本渲染 | flutter_markdown | Markdown 解析+渲染 |
| 编码工具 | qr (二维码生成) | 纯算法实现 |
| 网络协议 | mailer (SMTP) | Socket 通信 |
| 文档生成 | docs_gee (DOCX/PDF) | 字节流组装 |
---
## 三、纯 Dart 包适配步骤3步搞定
### 步骤 1: 拉取源码
```bash
cd packages
git clone --depth 1 --branch <版本号> <github地址> <包名>
```
### 步骤 2: 修改版本号
编辑 `pubspec.yaml`:
```yaml
# 修改前
version: 1.2.0
# 修改后(添加 -ohos.1 后缀标识已适配)
version: 1.2.0-ohos.1
```
### 步骤 3: 项目引用
编辑项目根目录的 `pubspec.yaml`:
```yaml
dependencies:
<包名>:
path: packages/<包名>
```
然后执行:
```bash
flutter pub get && flutter analyze --no-pub
```
### ✅ 完成!
> 就这么简单。不需要创建任何 ohos 文件,不需要写 Plugin.ets不需要配置 module.json5。
> Flutter 的 AOT 编译器会将纯 Dart 代码直接编译为各平台的机器码。
---
## 四、原生插件适配流程
> 详细步骤请参考 [ohos平台适配flutter三方库指导.md](./ohos平台适配flutter三方库指导.md)
### 4.1 概览流程
```
1. flutter create --platforms ohos <plugin>_ohos # 创建ohos模块骨架
2. 复制 android 版 lib/dart 代码,将 android 改为 ohos
3. DevEco Studio 编写 ets 原生代码(参考 android/ios 实现)
4. pubspec.yaml 添加 flutter.plugin.platforms.ohos 声明
5. DevEco Studio → Build → Make Module 打 .har 包
6. 确保 libs/flutter.har 存在(从其他已适配插件复制)
7. flutter create --platforms ohos example 创建验证工程
8. flutter run -d <device> 验证功能正常
```
### 4.2 关键文件清单
```
<plugin>/ohos/
├── Index.ets # 插件入口export Plugin 类
├── oh-package.json5 # 依赖声明,必须引用 libs/flutter.har
├── build-profile.json5 # 构建配置
├── libs/
│ └── flutter.har # ⚠️ 必须存在Flutter引擎库
└── src/main/
├── module.json5 # 模块声明type: "har"
├── resources/base/profile/ # 资源配置
└── ets/components/plugin/
└── <PluginName>Plugin.ets # 原生实现MethodChannel Handler
```
### 4.3 oh-package.json5 必要配置
```json
{
"name": "<plugin_name>",
"version": "1.0.0",
"description": "HarmonyOS implementation of <plugin>",
"main": "Index.ets",
"dependencies": {
"@ohos/flutter_ohos": "file:libs/flutter.har"
}
}
```
> ⚠️ `libs/flutter.har` 必须真实存在!否则编译通过但运行时闪退(9001005)。
---
## 五、⛔ 踩坑记录(血泪教训)
### 5.1 最严重: 给纯Dart包创建了空壳 ohos 目录
**时间**: 2026-04-25
**错误**: 为 9 个纯 Dart 包创建了空壳 ohos 目录(含 Index.ets、空壳 Plugin.ets 等)
**现象**: 鸿蒙端启动即闪退,无法进入任何页面
**错误码**: `9001005` (Invalid relative path)
**堆栈**: `copyResource → startInitialization → checkLoader → setupFlutterEngine → onCreate`
**根因分析**:
```
Flutter 引擎启动流程:
1. 扫描项目中所有含 ohos/ 目录的模块
2. 读取每个模块的 oh-package.json5
3. 解析 dependencies 中的 @ohos/flutter_ohos: "file:libs/flutter.har"
4. 尝试 copyResource 将 flutter.har 复制到应用沙箱
5. libs/flutter.har 不存在 → 9001005 崩溃
```
**修复**: 删除全部 9 个纯 Dart 包的 ohos 目录
**预防**:
```
在创建 ohos 目录之前,先确认:
✅ 该包是否真的有原生代码MethodChannel/FFI
✅ 该包的 android/ios 目录下是否有真实的 Kotlin/Swift 实现?
如果都是 NO → 禁止创建 ohos 目录!
```
### 5.2 其他常见问题
| 问题 | 原因 | 解决方案 |
|------|------|---------|
| 编译通过但运行闪退 | ohos目录存在但 libs/flutter.har 缺失 | 从已适配插件复制 har 文件 |
| analyze 报错找不到类 | pubspec.yaml 中 pluginClass 配置错误 | 检查 dart 侧注册的类名 |
| MethodChannel 无响应 | ets 侧 handler 未正确注册 | 检查 onAttachedToEngine 中的 setMethodCallHandler |
| har 包体积过大 | example/ohos 未删除 | 删除 example 下的 ohos 目录 |
---
## 六、检查清单(适配完成后逐项确认)
### 纯 Dart 包
- [ ] 已修改 version 后缀为 `-ohos.1`
- [ ] **没有** ohos/ 目录
- [ ] **没有** Index.ets / Plugin.ets / module.json5
- [ ] `flutter pub get` 通过
- [ ] `flutter analyze --no-pub` 通过
### 原生插件
- [ ] 已修改 version 后缀为 `-ohos.1`
- [ ] ohos/ 目录结构完整
- [ ] `libs/flutter.har` 文件真实存在(非空文件)
- [ ] `oh-package.json5` 正确引用 flutter.har
- [ ] `module.json5` 中 type 为 `"har"`
- [ ] Index.ets 正确 export Plugin 类
- [ ] ets 代码实现了 MethodChannel handler
- [ ] pubspec.yaml 中声明了 `flutter.plugin.platforms.ohos`
- [ ] DevEco Studio 编译 har 成功
- [ ] example 工程可正常运行
---
## 七、参考文档
| 文档 | 用途 |
|------|------|
| [ohos平台适配flutter三方库指导.md](./ohos平台适配flutter三方库指导.md) | 原生插件完整适配流程(含截图和详细步骤) |
| [开发FFI plugin.md](./开发FFI plugin.md) | FFI 插件开发指南C/C++ 原生库) |
| [OpenHarmony应用如何集成Flutter模块.md](./OpenHarmony应用如何集成Flutter模块.md) | Flutter 模块集成到鸿蒙应用的架构文档 |
| [FlutterChannel通信.md](./如何使用Flutter与OpenHarmony通信%20FlutterChannel.md) | MethodChannel / EventChannel / BasicMessageChannel API 用法 |
| [本地已适配鸿蒙的库.md](./本地已适配鸿蒙的库.md) | 本项目已适配的具体包清单和使用示例 |