最近在折腾一件事:用 Flutter 给 OpenHarmony 设备做一个软件开发助手 App,核心功能是算法练习平台。说人话就是,让鸿蒙生态里的开发板、开源手机装上一个能刷题、能写代码、能跑测试用例的 App。这个项目做完以后,我对 Flutter 在 OpenHarmony 上的适配情况有了非常具体的认识,也踩了不少文档里根本没写的坑。如果你正准备入坑 Flutter for OpenHarmony,或者想在非标准 Android 设备上做一款工具类应用,这篇文章应该能帮你省下不少时间。
我会按照这个实战项目的完整脉络来写,从技术选型、架构设计、核心模块实现,到环境搭建、真机调试、问题排查,最后聊到打包发布和后续扩展方向。整个过程会带上具体的命令、配置和踩坑实录,尽量让你照着就能走通一条路。
1. 项目整体设计与技术选型
1.1 为什么是 Flutter 而不是 ArkUI 或原生
做 OpenHarmony 应用,官方主推的是 ArkUI + ArkTS,但我在这个项目里还是选了 Flutter,而且是 Flutter for OpenHarmony 的社区分支。原因有三。
第一,算法练习平台的核心是代码编辑、判题执行、题目管理这类逻辑密集的功能,完全不依赖系统私有的 UI 组件。这类业务天然适合跨平台框架来承载。ArkUI 虽然学习曲线不算陡,但如果你之前积累的 Flutter 组件和页面代码没法复用,等于从零开始搭一套 UI 体系,成本会明显高出一截。
第二,Flutter for OpenHarmony 已经在 OpenHarmony SIG 里持续迭代,主仓库是 gitee 上的 flutter_flutter,它保留了 Flutter 的上层 API,对绝大多数第三方 Flutter 包都有比较高的兼容性。也就是说,你在 Android/iOS 上写的那套 UI 和业务逻辑,大概率能通过这个分支编译成 OpenHarmony 的 HAP 包。
第三,算法题库和判题逻辑本来就适合用 Dart 来实现。Dart 的集合操作、异步模型、类型系统,在写算法题相关代码时非常顺手。我可以把题库解析、测试用例匹配、代码模板生成这些东西全部用 Dart 写完,然后同一套代码直接跑在 Flutter 的 UI 层下面,不需要像 React Native 那样再去搭一层桥。
当然,这个选择也要付出代价。最直接的代价是插件生态的适配。OpenHarmony 不是 Android,那些依赖 Android SDK 的 Flutter 插件,比如 location、camera、share 等,基本不能直接用。好在我们这个项目里,核心插件是自己控制的,网络请求、文件存储、JSON 解析这些都是纯 Dart 实现,可以绕开大量系统 API 差异。
如果你也打算做类似工具型 App,我的建议是:优先考虑“纯 Dart 能力能覆盖 80% 功能”的项目形态。这样 Flutter for OpenHarmony 的兼容性优势才能最大化,而不是被插件适配拖垮。
1.2 整体架构与工程结构
整个 App 我采用了两层架构加一个本地执行引擎。
上层是 UI 层,负责首页题库列表、题目详情页、代码编辑器、运行结果页、学习统计页。状态管理用了 Provider,理由很简单:项目规模没有大到需要 Bloc 之类的重型方案,Provider 配合 ChangeNotifier 足够覆盖题目筛选和刷题状态的联动。
中层是数据层,处理题库 JSON 的加载、解析、搜索和分类筛选,以及刷题记录、收藏列表的本地持久化。这里我刻意把数据层和 UI 解耦,所有数据访问统一走 repository。这样后续想接在线题库,只需要替换 repository 的实现,不用动 UI。
底层是执行引擎,负责接收用户提交的代码,在受限环境下编译运行,然后把测试用例的通过情况逐条返回给 UI。这个模块是整个算法练习平台的关键,也是最容易出问题的地方,后面会单独展开。
工程结构上,我按 feature 分包:
text复制lib/
main.dart
app/
app.dart
routes.dart
theme.dart
features/
home/
question/
editor/
runner/
profile/
core/
models/
repositories/
services/
utils/
data/
questions.json
这里有个值得强调的点:题目数据我放在了 assets 里,而不是启动时从网络拉取。原因是在 OpenHarmony 开发板上,网络环境不一定稳定,而且很多时候你是在没有外网的局域网里调试。把题库内置,既能让首屏秒开,也能保证离线可用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法练习平台的核心模块设计与实现
2.1 题库数据模型与题目组织
算法练习平台的题库是内容的根基。我设计的数据模型很简单,但经过了几个版本的调整。
核心字段包括:题目 id、标题、难度、标签、题目描述、输入格式、输出格式、示例输入输出、初始代码模板、测试用例列表。测试用例我用 JSON 数组存储,每个用例包含输入和期望输出。输入统一按照字符串处理,这样在执行引擎里做解析时比较统一。
json复制{
"id": "two-sum",
"title": "两数之和",
"difficulty": "easy",
"tags": ["数组", "哈希表"],
"description": "给定一个整数数组 nums 和一个整数目标值 target,请在数组中找出和为目标值的两个整数,并返回它们的数组下标。",
"template": "List<int> twoSum(List<int> nums, int target) {\n \n}",
"testCases": [
{"input": "[2,7,11,15]\
