先说结论:Flutter 跨平台走鸿蒙这条路,目前不是“能不能跑”的问题,而是“怎么把工程梳理好”的问题。这次我接到的需求是把公司内部的一个车辆管理应用从 Android 单端扩展到鸿蒙设备上,功能包括车辆台账、出车单、保养提醒、驾驶员分配、车辆状态流转这一套典型业务。做完整轮适配后,我个人最大的感受是:Dart 层代码几乎不用大改,真正费时间的是环境搭建、权限模型适配、以及各种平台桥接的边界处理。这篇文章把整个项目从选型到上线过程中踩过的坑、验证过的方案、可以直接抄的配置全部整理出来,给后面要做 Flutter 鸿蒙开发的人省点弯路。
1. 项目背景与整体设计思路
1.1 一个老项目的跨端要求
这套车辆管理应用最早只有 Android 单端,日常使用场景非常明确:调度员在电脑上排班,司机用手机 App 扫码出车、上传里程、上报故障;维修组在后台录入保养记录;管理层看日报数据。整体业务不算重,但客户端涉及大量表单、状态切换和列表刷新,而且对 UI 一致性要求很高。
鸿蒙终端引入后,第一个问题就是:要不要用 ArkTS 单独重写一个版本?我把团队成员凑一起做了个粗略评估,如果完全重写,光是把现有的页面结构、网络层封装、离线缓存逻辑、扫码流程复刻一遍,至少需要两个 Android 开发投入一个半月,这还没算后续双端并行维护的隐性成本。而引入 Flutter 后,业务代码独立于平台,绝大多数网络请求、状态管理、数据模型、页面布局都留在 Dart 层,两端共用一套逻辑。最后拍板的方向就是:Flutter 统一业务代码,通过平台分支分别构建 Android 和鸿蒙产物。
选择 Flutter 还有两个现实考量。一个是渲染方式的差异——Flutter 用自绘引擎实现 UI,不依赖系统原生控件层级,因此在 Android 和鸿蒙上绘制出来的页面观感比较接近,不用等鸿蒙的控件风格逐一对齐。另一个是生态里纯 Dart 的三方包比例相当高,比如状态管理用的 provider、网络用的 dio、本地数据库用的 sqflite 或 drift,底层大多只依赖操作系统提供的通用接口,这让“双平台共用依赖”成为了可能。
1.2 车辆管理业务的需求拆解
项目启动前我把业务需求整理成了一张表,方便后续安排页面和接口优先级:
| 模块 | 核心功能 | 关键交互 |
|---|---|---|
| 车辆台账 | 车牌号、车型、车辆状态、绑定司机、位置信息 | 列表筛选、详情查看、状态图标区分 |
| 出车管理 | 创建出车单、选择用车人、填写用车时段 | 联系人选择、日期选择、状态审批 |
| 维保管理 | 保养记录、故障上报、维修历史 | 拍照上传、费用录入、历史记录联动 |
| 数据看板 | 今日出车数、车辆利用率、待保养提醒 | 图表展示、红点提醒 |
| 个人中心 | 驾驶员信息、账号切换、离线数据 | 列表导航、权限说明 |
从技术侧倒推,页面数量不算多,真正决定工程质量的是三块:列表刷新时的数据一致性、车辆状态的有限状态流转(比如“闲置”到“出勤”、再到“维修”),以及各种结构化表单的录入体验。因此架构上我把应用拆成了 数据模型层、服务层、页面层、平台桥接层 四层设计。数据模型和服务层保持纯 Dart,不引用任何平台相关 API;页面层只依赖 provider 和路由;只有真正要触碰系统能力的地方才放进桥接层,统一走 MethodChannel。
1.3 为什么要在 Flutter 里处理鸿蒙桥接
很多人以为 Flutter 适配鸿蒙就是把 SDK 切过来重新编译一次。实际不是这样,Flutter 官方主分支目前还没有把鸿蒙列为正式目标平台,工程里能直接构建鸿蒙产物,靠的是面向 OpenHarmony 的 Flutter 引擎适配分支和配套工具链。这套工具链会帮我们把 Flutter 引擎、Dart 虚拟机、渲染管线跑在鸿蒙的系统能力之上,让 flutter run 能感知到一个叫 OHOS 的目标平台。
平台通道层面,Flutter 在鸿蒙上同样支持 MethodChannel 机制。也就是说,你在 Android 里写的通道调用逻辑可以保留,只需要在鸿蒙原生侧用 ArkTS 实现对应的方法。车辆管理应用里我碰到的典型场景就是:需要从系统相册选择车辆照片、需要读取位置信息、需要写入本地缓存。这些都不能靠纯 Dart 完成,必须桥接到鸿蒙原生侧。因此我在架构规划阶段就把这些能力集中封装,避免业务页面里散落大量平台判断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与项目初始化中的关键细节
2.1 Flutter SDK 和鸿蒙工具链的安装顺序
先说最基础的 Flutter SDK 安装。很多人卡在第一步不是不会下载,而是安装完以后在终端里执行 flutter --version 仍然提示找不到命令。这个问题的原因往往不是安装失败,而是修改 PATH 环境变量后没有重新打开终端。Windows 下无论是通过系统设置改环境变量,还是用命令行工具写入,当前已经打开的终端窗口不会重新加载新 PATH
