Files
conti-docs/POC/Flutter-POC.md
T

61 lines
6.4 KiB
Markdown
Raw 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.
# Continental Retail APP | Flutter 鸿蒙 PoC 验证结论
## 0. 结论摘要
> **验证范围:** 本文记录 Flutter_OH(Flutter 官方鸿蒙分支)在 OpenHarmony 模拟器上的最小化验证结果——工程构建安装、Flutter↔OHOS 原生插件双向通信、未实现原生能力的显式失败、以及 WebView 最小化探针(含 JS↔Dart 桥接往返)。本轮**主动收敛范围**,不含真机硬件和性能测试;当前结果不等同于正式生产可用。
| 验证项 | 当前结果 | 状态 |
| --- | --- | --- |
| 工程构建、安装与首次启动 | debug HAP 构建、安装、首次启动均通过,登录页正常渲染 | 通过 |
| Flutter ↔ OHOS 原生插件往返 | `core_storage`(`shared_preferences_ohos`)写入/读回一致 | 通过 |
| 未实现原生能力的显式失败 | `native_scan` 按设计抛出 `NativeScanException(code=channel-error)`,非静默返回假数据 | 通过 |
| WebView 最小化探针 | 内联 HTML/本地 HTTP 页面均可渲染,JS↔Dart 桥接往返已实现 | 通过 |
**当前状态:** 工程构建/安装/启动链路、Flutter 与 OHOS 原生插件的基础双向通信、未实现能力的显式失败路径、WebView 最小化渲染与 JS↔Dart 桥接往返均已验证通过。
**未闭环事项:** 真机硬件能力(相机扫码、定位、推送等);签名发布与性能。更完整的验证方法论(含 N-01~N-05 原生桥接、W-01~W-06 WebView 测试等待实施项)见同目录下的 [Flutter-OH-POC.md](./Flutter-OH-POC.md)。
## 1. 验证范围与说明
本 PoC 重点确认 Flutter 官方鸿蒙分支(Flutter_OH)工程能否构建、安装和运行,已接入的原生插件双向通信是否正常,以及未实现的原生能力是否按预期显式失败而非静默降级。
验证对象为 Continental Retail APP 的 Flutter 工程(`harmony_3.41.9` 分支);涉及的目标平台为 Android、iOS 和鸿蒙,本文仅记录鸿蒙侧验证结果。验证环境:Flutter_OH `3.41.10-ohos-1.0.0`,模拟器 `127.0.0.1:5555`(`ohos-x64`)。
本轮验证通过仓库内新增的 `PocVerificationPage`(`app/lib/src/poc_verification_page.dart`)完成,该页面仅在非 prod flavor 下从工作台 AppBar 可见,只用于产出本文的验证截图,不是正式功能。WebView 探针额外拆分为单独的临时页面 `PocWebviewProbePage`(`app/lib/src/poc_webview_probe_page.dart`),直接使用 CPF-Flutter 的 OHOS 适配版 `webview_flutter`(commit SHA 固定),不经过仓库正式的 `core_webview` 封装,验证完成后即删除。
## 2. 验证结果
### 2.1 工程构建、安装与首次启动
**结论:通过。** 执行仓库根目录 `enable-ohos.ps1` 启用 `hvigorw`/`ohpm` 工具链后,`flutter build hap --debug --target-platform ohos-x64` 构建通过并安装到模拟器,App 首次启动、登录页正常渲染。
此前曾出现启动白屏:根因是 `packages/core_storage/pubspec.yaml` 把 `shared_preferences` git 依赖按**分支名**(而非 commit SHA)固定,Windows 下 Dart pub 的本地 git 缓存复用了错误的工作树,静默 fallback 到无 OHOS 实现的托管版 `shared_preferences`,导致 `SharedPreferencesPlugin` 未注册、启动早期即挂死。修复方式是把 `ref` 固定为具体 commit SHA(`19bd50ff6d5eaa96f18c63796c51e1b4e78a7480`),修复后验证登录页恢复正常渲染。
![登录页正常渲染](images/flutter-login-page.png)
### 2.2 Flutter ↔ OHOS 原生插件往返
**结论:通过。** 在 `PocVerificationPage` 中通过 `core_storage` 的 `Prefs`(包装 `shared_preferences_ohos`)写入一个带时间戳的探针值,再读回比对,写入值与读回值一致,证明 Flutter Dart 层与 OHOS 侧原生插件的双向通信链路正常工作。
![Prefs 探针写入读回一致](images/flutter-poc-prefs-probe.png)
### 2.3 未实现原生能力的显式失败(native_scan)
**结论:通过(显式失败,但失败层级与预期不同)。** `native_scan` 在 Android/iOS 侧是有意保留的 TODO 桩代码,OHOS 侧完全没有桥接声明。在 `PocVerificationPage` 中调用 `NativeScan().startScan(...)` 实际抛出的是 `NativeScanException(code=channel-error, message=Unable to establish connection on channel: "dev.flutter.pigeon.native_scan.ScanHostApi.startScan")`——这是 Pigeon 生成的平台通道找不到任何 OHOS 端注册实现时的通道级错误,而不是应用层预先定义的 `UNSUPPORTED_PLATFORM` 语义错误码(OHOS 侧目前确实也没有实现任何一种 stub)。结论仍然是通过:未实现的原生能力确实显式失败并携带可诊断的错误信息,没有静默返回假数据;但如果未来要在 OHOS 侧交付一个"显式声明不支持"的体验(而非通道级异常),需要补一个轻量 OHOS stub 实现去主动抛出语义化的 `UNSUPPORTED_PLATFORM`。
![native_scan 抛出 channel-error](images/flutter-poc-scan-probe.png)
### 2.4 WebView 最小化探针与 JS↔Dart 桥接
**结论:通过。** 本轮的临时、单文件 WebView 探针页(`app/lib/src/poc_webview_probe_page.dart`,直接依赖 CPF-Flutter 的 OHOS 适配版 `webview_flutter`/`webview_flutter_ohos`,commit SHA 固定,不经过仓库正式的 `core_webview` 封装)验证了两件事:WebView 组件能否在 OHOS 上渲染,以及最基础的 JS↔Dart 双向桥接(`addJavaScriptChannel`)能否工作。两种加载路径——`loadHtmlString` 内联 HTML、`loadRequest` 加载本地 HTTP 页面(`app/poc_html/index.html`,配合 VS Code Live Server,端口 5500)——都注册了同一个 `PocBridge` 通道:页面里点击「JS → Dart 桥接测试」按钮会把消息发给 Dart,Dart 收到后再调用 `runJavaScript` 回写页面文字,确认双向都通。两条路径均渲染正常,桥接往返符合预期。
![WebView 探针页正常渲染(点击加载前)](images/flutter-poc-webview-probe.png)
![WebView 探针页正常渲染(点击加载后)](images/flutter-poc-webview-success.png)
## 3. 开发工具链问题
### 3.1 `hvigorw`/`ohpm` 需要每个终端会话单独启用 PATH
**POC 观察:** `hvigorw` 和 `ohpm` 不在默认 `PATH` 中,每个新终端会话需要先执行仓库根目录的 `enable-ohos.ps1` 设置 `DEVECO_HOME`/`DEVECO_SDK_HOME` 并追加 `PATH`,否则 `flutter build hap` 会报 `Failed to find hvigorw in the search path`。这一步容易被遗忘,建议在 OHOS 相关文档里显著提示。