- 标准编辑器: freezed数据模型 + 5Tab工具栏 + 多图层管理 + 文字增强 + 背景系统 + 导出链路 - 迷你编辑器: 极简6项功能(文字/字号/颜色/背景/预览/导出) + 三种调用方式(全屏/半屏/内嵌) - 共享组件: GlassSlider/ColorPicker/FontPicker/TipsView - 服务层: ExportService/ImageImportService/FontService/XycardService - 设计系统: 统一主题令牌 + Liquid Glass风格
227 lines
6.0 KiB
Markdown
227 lines
6.0 KiB
Markdown
# OpenHarmony应用如何集成Flutter模块
|
||
|
||
## 1. 前置条件
|
||
|
||
- 完成 [Flutter OH 环境搭建](https://gitcode.com/openharmony-tpc/flutter_samples/blob/master/ohos/docs/03_environment/OpenHarmony-flutter%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E6%8C%87%E5%AF%BC.md)
|
||
- 已安装 [DevEco Studio](https://developer.huawei.com/consumer/cn/deveco-studio/) 工具
|
||
|
||
## 2. 创建鸿蒙项目
|
||
|
||
1. 打开 `DevEco Studio`,选择 `File -> New -> Create Project` 创建项目。
|
||
|
||
2. 项目创建完成,查看目录结构,以下几个文件与集成Flutter相关:
|
||
|
||
```json
|
||
Project/
|
||
├─ oh-package.json5 # 项目依赖配置
|
||
├─ entry/ # 主模块目录
|
||
│ ├─ oh-package.json5 # 主模块依赖配置
|
||
│ └─ src/
|
||
│ ├─ main/
|
||
│ │ ├─ ets/
|
||
│ │ │ ├─ entryability/
|
||
│ │ │ │ └─ EntryAbility.ets # 主模块Ability
|
||
│ │ │ └─ pages/
|
||
│ │ │ └─ Index.ets # 页面代码
|
||
│ │ └─ resources/
|
||
│ │ ├─ base/
|
||
│ │ │ └─ profile/
|
||
│ │ │ └─ main_pages.json # 页面配置
|
||
```
|
||
|
||
## 4.集成Flutter
|
||
|
||
### 4.1 创建Flutter模块
|
||
|
||
在项目根目录下执行:
|
||
|
||
```bash
|
||
flutter create -t module flutter_module
|
||
```
|
||
|
||
生成 `flutter_module` 模块
|
||
|
||
### 4.2 构建Flutter模块
|
||
|
||
进入 `flutter_module` 目录,执行:
|
||
|
||
```bash
|
||
flutter build har --debug # --[debug,--release]
|
||
```
|
||
|
||
执行完成,打开`Project/flutter_module/build/ohos/har/` 目录:
|
||
|
||
```json
|
||
debug/
|
||
|--arm64_v8a_debug.har
|
||
|--flutter_embedding_debug.har
|
||
|--flutter_module.har
|
||
```
|
||
|
||
生成3个har文件,即构建成功。
|
||
|
||
> **注意:**需要将以上构建生成的har文件拷贝至项目根路径 `Project/har` 下,否则打包时会重复引入,导致包体积增大。
|
||
|
||
### 4.3 配置Flutter模块
|
||
|
||
1. 修改主项目 `oh-package.json5`
|
||
|
||
打开项目`Project/oh-package.json5`文件,在 `"overrides"`节点添加如下内容(路径需替换为实际HAR包路径):
|
||
|
||
```json
|
||
"overrides": {
|
||
"@ohos/flutter_ohos": "file:./har/flutter_embedding_debug.har",
|
||
"flutter_native_arm64_v8a": "file:./har/arm64_v8a_debug.har",
|
||
"@ohos/flutter_module": "file:./har/flutter_module.har"
|
||
}
|
||
```
|
||
|
||
2. 修改 `Project/entry/oh-package.json5`
|
||
|
||
打开 `Project/entry/oh-package.json`,在 `"dependencies"` 节点添加如下内容:
|
||
|
||
```json
|
||
"dependencies": {
|
||
"@ohos/flutter_ohos": "",
|
||
"flutter_native_arm64_v8a": "",
|
||
"@ohos/flutter_module": ""
|
||
}
|
||
```
|
||
|
||
3. 执行 `Sync Now` 或 `ohpm install`
|
||
|
||
执行完成,查看 `Project/entry` 目录:
|
||
|
||
```json
|
||
Project/
|
||
├─ entry/
|
||
│ ├─ oh_modules # 依赖包缓存
|
||
```
|
||
|
||
`oh_modules` 目录生成,集成完成。
|
||
|
||
## 5. 加载显示Flutter
|
||
|
||
**完成Flutter模块集成之后,就可以显示Flutter相关页面**
|
||
|
||
1. 鸿蒙Ability生命周期与Flutter模块集成
|
||
|
||
```js
|
||
export default class EntryAbility extends UIAbility {
|
||
|
||
detachFromFlutterEngine(): void {
|
||
}
|
||
|
||
getAppComponent(): UIAbility {
|
||
return this;
|
||
}
|
||
|
||
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
|
||
FlutterManager.getInstance().pushUIAbility(this);
|
||
}
|
||
|
||
onDestroy(): void | Promise<void> {
|
||
FlutterManager.getInstance().popUIAbility(this);
|
||
}
|
||
|
||
onWindowStageCreate(windowStage: window.WindowStage): void {
|
||
windowStage.getMainWindowSync().setWindowLayoutFullScreen(true);
|
||
FlutterManager.getInstance().pushWindowStage(this, windowStage);
|
||
windowStage.loadContent('pages/Index');
|
||
}
|
||
|
||
onWindowStageDestroy() {
|
||
FlutterManager.getInstance().popWindowStage(this);
|
||
}
|
||
}
|
||
```
|
||
|
||
2. 实现FlutterEntry类
|
||
|
||
```js
|
||
export default class MyFlutterEntry extends FlutterEntry {
|
||
configureFlutterEngine(flutterEngine: FlutterEngine): void {
|
||
super.configureFlutterEngine(flutterEngine);
|
||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||
|
||
// 在这里注册需要使用的插件
|
||
this.delegate?.addPlugin(new CustomPlugin());
|
||
}
|
||
}
|
||
```
|
||
|
||
3. 新建一个Page页,用于显示Flutter页面
|
||
|
||
```js
|
||
@Entry
|
||
@Component
|
||
struct FlutterIndex {
|
||
private flutterEntry: FlutterEntry | null = null;
|
||
private flutterView?: FlutterView
|
||
|
||
aboutToAppear() {
|
||
this.flutterEntry = new MyFlutterEntry(getContext(this))
|
||
this.flutterEntry.aboutToAppear()
|
||
this.flutterView = this.flutterEntry.getFlutterView()
|
||
}
|
||
|
||
aboutToDisappear() {
|
||
this.flutterEntry?.aboutToDisappear()
|
||
}
|
||
|
||
onPageShow() {
|
||
this.flutterEntry?.onPageShow()
|
||
}
|
||
|
||
onPageHide() {
|
||
this.flutterEntry?.onPageHide()
|
||
}
|
||
|
||
build() {
|
||
Stack() {
|
||
FlutterPage({ viewId: this.flutterView?.getId() })
|
||
}
|
||
}
|
||
|
||
onBackPress(): boolean {
|
||
this.flutterEntry?.onBackPress();
|
||
return true
|
||
}
|
||
}
|
||
```
|
||
|
||
4. 打开 `Project/entry/src/main/resources/base/profile/main_pages.json` 文件,配置新增 `Page`:
|
||
|
||
```json
|
||
{
|
||
"src": [
|
||
"pages/Index",
|
||
"pages/FlutterIndex"
|
||
]
|
||
}
|
||
```
|
||
|
||
5. 路由打开Flutter页面
|
||
|
||
```js
|
||
Button('打开 Flutter 页面')
|
||
.onClick(() => {
|
||
router.push({
|
||
url: 'pages/FlutterIndex',
|
||
})
|
||
});
|
||
```
|
||
|
||
## 6. FAQ
|
||
|
||
- 集成 `flutter_module` 后,`entry` 里没有生成 `oh_modules` 缓存目录。
|
||
|
||
需要在项目根路径下执行 `ohpm install`,不是在 `entry` 下执行。
|
||
|
||
- 修改了 `flutter_modules` 里的代码,没有生效。
|
||
|
||
修改 `flutter_modules` 里的业务代码之后,需要在 `flutter_modules` 目录下执行 `flutter build har --[debug, release]` 命令,用于更新har包。
|
||
|
||
- 多模块项目打包出来的包体积很大。
|
||
|
||
需要将多个 `module` 里构建出来的 har 文件统一放到 项目根路径下,避免重复引入导致包体积膨胀。 |