鸿蒙从一个新需求出发,如何判断该改 Flutter,还是 channel,还是 ArkTS

适合谁看

  • 在多层项目里经常不知道该从哪改的人

  • 团队里需要统一分工判断规则的人

  • 正在持续往项目里加新鸿蒙能力的人

问题背景

一个需求看起来可能很小,但它实际影响的层次并不一样。比如:

  • 只是改一个页面文案

  • 还是多一个语音状态

  • 还是要接一个新的系统 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,分别对应不同性质的复杂度:

  1. 页面表达问题 --- 只改 Flutter 页面层

  2. 已有 channel 没消费好 --- 改 Flutter 消费逻辑

  3. channel 缺方法 --- 在现有 channel 加方法

  4. 整类能力不存在 --- 新增 channel + 插件

  5. 涉及新 Kit / 权限 / Ability --- 改 ArkTS 原生层

只要这套判断规则稳定下来,项目后续扩展会顺很多。