我记得很清楚,那是去年初接手的一个需求:要把一套已有的Flutter逆向思维训练App迁移到OpenHarmony平台,同时补上一直缺位的学习日历功能。当时围绕这个项目查了不少资料,也踩了不少OpenHarmony生态特有的坑。现在把这段实战经验完整梳理一遍,从环境搭建到日历实现,再到各种奇奇怪怪的兼容性问题,希望对打算在OpenHarmony上搞Flutter开发的朋友有帮助。
1. 项目背景与整体思路拆解
1.1 为什么选Flutter做OpenHarmony应用
先回答一个绕不开的问题:OpenHarmony有自己的ArkUI开发体系,为什么还要用Flutter?当时团队的情况是,已经有了一套完整的Flutter代码库,包含题库模块、练习模式、成就系统,如果全部用ArkTS重写,保守估计要两三个月。而Flutter for OpenHarmony这个官方支持方案,本身就是OpenHarmony生态重点推进的方向,社区活跃度已经上来了,不是那种半死不活的实验项目。权衡下来,复用Flutter代码的成本最低,后续双端同步维护也方便。
不过必须要说的是,这里的“迁移”不是直接把Flutter工程的targetPlatform改一下就完事。OpenHarmony的Flutter SDK是分叉维护的,官方main分支并不直接支持,需要切换到对应的openharmony版本分支,整个工程的构建体系也不一样,Android工程对应的是HarmonyOS工程。这块在第二节会细说。
1.2 逆向思维训练App的产品设计思路
逆向思维训练的核心玩法很简单但也很考验逻辑:每道题给出一个问题和一个常规答案,用户需要打破惯性,从反方向思考,给出一个与常规答案相反的、但逻辑上说得通的答案。举个经典例子——“一个人走进了一家餐厅,但他没有吃饭就离开了,请从逆向角度解释这个行为”。常规思维是他不饿或者餐厅太贵,逆向思维可能是这个人是厨师,刚下班,或者他是来送外卖的,甚至他走进的是“餐厅”但不是“吃饭的地方”。
功能上主要分三大块:
- 每日训练:系统每天给一组题目(默认10道),用户逐题作答,提交后系统参考题库中的参考答案做宽松匹配评分。评分不是死板的字符串比对,而是看关键词命中率。
- 题库管理:本地预置200道题,按难度分级,支持随机抽取和按标签筛选。
- 学习日历:记录每天的训练情况,包括完成题目数、正确率、连续打卡天数,在日历上用不同颜色标注。
学习日历是这个版本新增的核心功能,用户坚持训练的正反馈全看这里。日历做得好不好,直接决定用户留存。
1.3 学习日历功能定位
我当时对日历模块的定位是:不做成简单的打卡工具,而是做成“学习足迹”。每天训练完成,日历上会记录当天的得分、用时、正确率;连续打卡超过7天、30天会有成就徽章;点击某一天可以回看当天的答题明细。数据全部存在本地,不上云,这既保护了用户隐私,也省去了后端开发成本。
技术难点其实集中在两个地方:
- 日历组件的渲染性能。OpenHarmony上Flutter的渲染走的是自绘引擎,不等于ArkUI的原生组件,复杂UI下帧率容易掉。
- 日期数据与训练记录的数据结构设计。要支持按天查询、按月统计、连续打卡天数计算,表结构和查询逻辑一开始就要想清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备与工程搭建
2.1 Flutter for OpenHarmony的SDK准备
首先要明确版本对应关系。OpenHarmony的Flutter SDK目前主要维护在Gitee的openharmony-sig/flutter_flutter仓库,分支命名一般对应Flutter版本号。我当时用的是OpenHarmony 4.1 Release,对应的Flutter SDK分支是OpenHarmony-4.1-Release,建议直接看仓库README,找到和自己系统版本匹配的分支。
环境上需要准备四样东西:
- OpenHarmony SDK,对应API版本要和系统匹配,我用的是API 10。
- DevEco Studio,用于构建和签名HarmonyOS工程。
- Flutter SDK(OpenHarmony版本),注意不要和Google官方版本混用。
- 真实的OpenHarmony开发板或手机,我自己用的是一台RK3568开发板。
这里有个容易踩的坑:环境变量里的PATH一定把OpenHarmony版Flutter放在官方版前面,两个版本的flutter命令都叫flutter,很容易搞混。我一开始就因为这个,一直在用官方版SDK,结果flutter doctor永远显示不支持OpenHarmony,排查了半天才发现是PATH顺序问题。
2.2 工程配置要点和骨架搭建
创建工程的命令和标准Flutter一样:
bash复制flutter create --org com.example --project-name reverse_trainer .
但创建完后的工程结构需要手动调整。关键在于增加OpenHarmony的工程目录,通常用命令行工具生成:
bash复制flutter create --platforms ohos .
这个命令会在工程下生成ohos目录,里面是标准的OpenHarmony hap工程结构。接下来要做的几个关键操作:
- 在ohos/app/src/main/module.json5里配置应用权限和入口Ability。注意OpenHarmony的Ability模型和Android的Activity差异很大,入口需要继承UIAbility,并重写onWindowStageCreate方法。
- 在pubspec.yaml里不需要额外加特殊依赖,但要注意一些插件需要OpenHarmony适配版,比如shared_preferences,要用openharmony官方适配的版本。
这里重点说一下UIAbility的配置。在module.json5里要声明入口页面:
json复制{
"mainElement": "EntryAbility",
"abilities": [
{
"name
