适合谁看
-
在多层项目里经常不知道该从哪改的人
-
团队里需要统一分工判断规则的人
-
正在持续往项目里加新鸿蒙能力的人
问题背景
一个需求看起来可能很小,但它实际影响的层次并不一样。比如:
-
只是改一个页面文案
-
还是多一个语音状态
-
还是要接一个新的系统 API
如果每次都直接从最熟的那层下手,边界很容易被打穿。
典型错误:
| 错误 | 说明 |
|---|---|
| 页面显示问题也去改原生插件 | 应该只改 Flutter 页面 |
| 需求只是少了一层翻译,却误判成要接新 Kit | 应该只改 Channel 层 |
| 通道层职责不清,导致每次需求都不知道该改哪 | 应该先理清边界 |
| 以"谁更熟"为标准 | 应该以"复杂度属于哪层"为标准 |
项目中的真实场景
食界探味当前的三层边界很明确:
Flutter 页面和业务层
└─ app/lib/features/
平台边界层
└─ app/lib/core/platform/
ArkTS 原生实现层
└─ app/ohos/entry/src/main/ets/plugins/
| 层 | 文件 | 职责 |
|---|---|---|
| Flutter 页面层 | app/lib/features/ai_assistant/ |
UI 渲染、交互、状态展示 |
| 平台边界层 | app/lib/core/platform/*.dart |
通道封装、事件接收、结果消费 |
| ArkTS 原生层 | app/ohos/entry/src/main/ets/plugins/*.ets |
系统 API 调用、权限、引擎 |
核心实现
一、先问:这是页面表达问题,还是系统能力问题
判断标准:
| 如果需求只是... | 改哪里 |
|---|---|
| 页面怎么显示 | Flutter 页面层 |
| 交互怎么排 | Flutter 页面层 |
| 状态怎么呈现 | Flutter 页面层 |
| 需要新的权限 | ArkTS 原生层 |
| 需要新的系统 API | ArkTS 原生层 |
| 需要新的系统事件监听 | ArkTS 原生层 |
关键点: 这一步的关键不是"问题是不是出现在页面上",而是"这个复杂度真正属于哪一层"。
示例分析:
| 需求 | 表面看 | 实际应该改 |
|---|---|---|
| 菜品详情页没有正确打开 | 页面问题 | 可能是系统入口参数没被正确消费 |
| 语音识别结果没有显示 | 页面问题 | 可能是 Channel 层没正确回传 |
| TTS 播报没声音 | 页面问题 | 可能是 ArkTS 引擎创建失败 |
二、再问:Flutter 侧是否已经有能力边界,只是没消费好
有些需求并不需要新增 ArkTS。例如:
-
原生事件已经有了
-
Flutter 只是没有正确展示
这时更适合先改:
-
页面
-
状态管理
-
core/platform的结果消费逻辑
食界探味的现有边界层:
| 边界层 | 已有能力 | 页面只需消费 |
|---|---|---|
IntentNavigationChannel |
pageId → 路由映射 | 路由跳转 |
AntiPeepProtectionChannel |
HIDE/PASS 事件 | 隐藏/显示内容 |
SpeechRecognitionChannel |
语音识别结果 | 显示文本 |
TextToSpeechChannel |
TTS 播报 | 控制播报状态 |
判断方法:
页面需要的语义,core/platform 里已经有了吗?
│
├─ 有了 → 只改 Flutter 页面层
│
└─ 没有 → 继续问下一步
三、只有在能力边界本身缺失时,才去加 channel
如果当前项目里根本没有这项能力的通道出口,才需要:
-
新增
xxx_channel.dart -
新增对应插件
不要把"页面不会用"误判成"必须新增插件"。
判断方法:
已有 channel 只是少了一个方法,还是整类能力根本不存在?
│
├─ 少了一个方法 → 在现有 channel 加方法
│
└─ 整类能力不存在 → 新增 channel + 插件
示例分析:
| 需求 | 判断 | 改哪里 |
|---|---|---|
| TTS 播报时增加语速参数 | 已有 TextToSpeechChannel | 在现有 channel 加参数 |
| 接入新的 OCR 能力 | 整类能力不存在 | 新增 OcrChannel + 插件 |
| 防窥保护增加新的状态 | 已有 AntiPeepProtectionChannel | 在现有 channel 加事件 |
四、只有在系统 API 本身没接入时,才去动 ArkTS
真正需要改 ArkTS 的典型信号是:
| 信号 | 说明 |
|---|---|
| 需要新的 Kit | 如 CoreVisionKit、CoreMediaKit |
| 需要新的权限 | 如相机、位置、蓝牙 |
| 需要新的 Ability / Form 生命周期能力 | 如桌面卡片 |
| 需要新的系统事件监听 | 如防窥状态、网络变化 |
判断方法:
需求涉及新的系统权限、Kit、Ability、系统事件吗?
│
├─ 涉及 → 改 ArkTS 原生层
│
└─ 不涉及 → 不需要改 ArkTS
五、完整的判断流程图
新需求来了
│
▼
第 1 步:这是页面表达问题,还是系统能力问题?
│
├─ 只影响页面呈现 → 改 Flutter 页面层
│
└─ 涉及系统能力 → 继续
│
▼
第 2 步:Flutter 侧是否已有能力边界?
│
├─ 已有 channel,只是没消费好 → 改 Flutter 消费逻辑
│
└─ 没有对应 channel → 继续
│
▼
第 3 步:已有 channel 是否缺方法?
│
├─ 少了一个方法 → 在现有 channel 加方法
│
└─ 整类能力不存在 → 继续
│
▼
第 4 步:涉及新的系统 API 吗?
│
├─ 涉及新 Kit / 权限 / Ability / 事件 → 改 ArkTS 原生层
│
└─ 不涉及 → 不需要改 ArkTS
六、用真实需求做判断练习
练习 1:AI 助手页面想增加"语音播报"按钮
第 1 步:这是页面表达问题还是系统能力问题?
→ 语音播报涉及 TTS 系统能力 → 继续
第 2 步:Flutter 侧是否已有能力边界?
→ 已有 TextToSpeechChannel → 只改 Flutter 消费逻辑
结论:改 Flutter 页面层(加按钮 + 调用 channel)
练习 2:想接入新的 OCR 识别能力
第 1 步:这是页面表达问题还是系统能力问题?
→ OCR 涉及系统能力 → 继续
第 2 步:Flutter 侧是否已有能力边界?
→ 没有 OcrChannel → 继续
第 3 步:已有 channel 是否缺方法?
→ 整类能力不存在 → 继续
第 4 步:涉及新的系统 API 吗?
→ 需要 CoreVisionKit → 改 ArkTS 原生层
结论:新增 OcrChannel + OcrPlugin + 权限声明
练习 3:防窥保护想增加"自定义蒙层样式"
第 1 步:这是页面表达问题还是系统能力问题?
→ 蒙层样式是页面表达 → 改 Flutter 页面层
结论:只改 Flutter 页面层(自定义蒙层 UI)
练习 4:语音识别想支持更多语言
第 1 步:这是页面表达问题还是系统能力问题?
→ 语言支持涉及系统能力 → 继续
第 2 步:Flutter 侧是否已有能力边界?
→ 已有 SpeechRecognitionChannel → 继续
第 3 步:已有 channel 是否缺方法?
→ channel 已有 language 参数 → 只改 Flutter 传参
结论:改 Flutter 页面层(传不同 language 参数)
练习 5:想接入鸿蒙分布式能力
第 1 步:这是页面表达问题还是系统能力问题?
→ 分布式能力涉及系统能力 → 继续
第 2 步:Flutter 侧是否已有能力边界?
→ 没有 DistributedChannel → 继续
第 3 步:已有 channel 是否缺方法?
→ 整类能力不存在 → 继续
第 4 步:涉及新的系统 API 吗?
→ 需要 DistributedKit → 改 ArkTS 原生层
结论:新增 DistributedChannel + DistributedPlugin + 权限声明
关键代码位置
| 文件 | 层 |
|---|---|
app/lib/features/ |
Flutter 页面层 |
app/lib/core/platform/ |
平台边界层 |
app/ohos/entry/src/main/ets/plugins/ |
ArkTS 原生层 |
app/ohos/entry/src/main/module.json5 |
权限和配置 |
常见坑
-
页面显示问题也去改原生插件 --- 应该先检查 Flutter 页面层
-
需求只是少了一层翻译,却误判成要接新 Kit --- 应该只改 Channel 层
-
通道层职责不清,导致每次需求都不知道该改哪 --- 应该先理清边界
-
以"谁更熟"为标准 --- 应该以"复杂度属于哪层"为标准
-
没有先检查现有 channel --- 可能只需要加一个方法
-
没有先检查现有权限 --- 可能权限已经声明了
可复用模板
判断流程模板
先问:
这是页面表达问题、平台边界问题,还是系统能力问题
页面表达问题 → Flutter 页面层
平台边界问题 → core/platform 层
系统能力问题 → ArkTS 原生层
快速判断模板
需求来了,先回答这 3 个问题:
1. 只影响页面呈现吗?
→ 是 → 改 Flutter
2. 需要新的平台语义出口吗?
→ 是 → 改 core/platform
3. 涉及新的系统权限、Kit、Ability、系统事件吗?
→ 是 → 改 ArkTS
各层职责清单
Flutter 页面层:
□ UI 渲染
□ 交互逻辑
□ 状态展示
□ 路由承接
□ 已有 channel 结果消费
平台边界层(core/platform):
□ MethodChannel 封装
□ 事件监听和回推
□ 结果翻译和消费
□ pending 机制
ArkTS 原生层:
□ 系统 API 调用
□ 权限申请
□ 引擎生命周期
□ 系统事件监听
□ 能力注册
本篇总结
新需求来了之后,先判层,比马上写代码更重要。改 Flutter、改 channel、改 ArkTS,分别对应不同性质的复杂度:
-
页面表达问题 --- 只改 Flutter 页面层
-
已有 channel 没消费好 --- 改 Flutter 消费逻辑
-
channel 缺方法 --- 在现有 channel 加方法
-
整类能力不存在 --- 新增 channel + 插件
-
涉及新 Kit / 权限 / Ability --- 改 ArkTS 原生层
只要这套判断规则稳定下来,项目后续扩展会顺很多。
