1. 项目背景与技术选型
1.1 为什么要在OpenHarmony上用Flutter
先说结论:如果你正在评估“跨端开发鸿蒙应用”这件事,Flutter for OpenHarmony是目前性价比极高的一条路。
我最早接触OpenHarmony是拿RK3568的开发板试水,当时第一感受是:设备树版本多到让人头大。RK3568在不同厂商板卡上的设备树配置差异很大,选择错了轻则外设不工作,重则系统直接起不来。但比设备树更令人头疼的,是应用生态几乎从零起步。你写一个Hello World容易,真要做一个带网络请求、本地存储、复杂交互的App,原生开发的工作量会成倍增加,而OpenHarmony目前的开发者数量也远不如Android和iOS,遇到问题能查到的资料相对有限。
这时候Flutter for OpenHarmony的优势就体现出来了。Flutter本身是跨端UI框架,底层渲染引擎是自绘的,不依赖系统原生控件,天然适合移植到新平台。OpenHarmony的官方和社区一起维护了Flutter的鸿蒙适配分支,把引擎层对接到了OpenHarmony的图形栈和事件分发,Dart代码基本不用改,UI层能复用绝大部分逻辑。
我做的这个“衣橱管家”App,本质上就是一个典型的跨端业务应用:需要拍照或选择图片录入衣物、需要调天气接口、需要根据天气数据做穿搭推荐、还需要本地数据库存衣物信息和搭配记录。这套需求放在Android和iOS上,Flutter生态里能找到现成的库;放在OpenHarmony上,Flutter分支也能提供接近一致的开发体验。
更实际的一点:如果你已经有一个Flutter项目,想让它跑在OpenHarmony设备上,迁移成本比从零写一套鸿蒙原生要低得多。我实测下来,纯Dart层的业务代码改动量很少,主要工作集中在平台通道对接、权限声明和少量原生插件替换上。
1.2 衣橱管家App的定位与核心场景
衣橱管家这个App,名字听起来挺小资,但解决的是非常具体的日常痛点:每天早上出门前纠结穿什么。尤其是换季的时候,衣柜里衣服一堆,你就是不知道今天该穿哪件。不是没衣服,是衣服太多反而决策困难。
我做的这个版本聚焦三个核心场景:
第一,衣物数字化管理。把自己衣柜里的衣服录入App,包括品类、颜色、材质、厚薄等级、适合的温度区间,甚至可以拍张照片存在本地。有了这个数字衣橱,后续所有推荐才有数据基础。
第二,天气感知。App获取用户所在城市的实时天气和今日气温,自动判断冷暖。这一步光有温度还不够,天气现象也很重要:大晴天和下雨天对穿搭的要求完全不同,风力大小也会影响外套选择。
第三,穿搭推荐。这是整个App的灵魂。系统根据当天的天气数据和用户衣橱里的衣物,自动组合出一套或几套穿搭方案,按照适配度排序。推荐结果不是瞎拼凑,背后有一套规则引擎在跑。
这个项目适合谁参考?如果你是Flutter开发者,想了解OpenHarmony适配的坑;或者你在做IoT、智能家居、工具类App,需要覆盖多设备平台;再或者你自己就想做一个私人衣橱工具,这个项目的拆分思路和代码结构都能直接用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整体架构设计与数据模型
2.1 功能模块拆解
整个App按功能边界拆成四个模块,模块之间通过数据模型和Service层解耦,UI层不直接操作数据库和网络。
衣物管理模块负责衣物的增删改查,包括拍照、编辑属性、按分类筛选。这一块核心是本地数据库设计,我用的是sqflite插件,在OpenHarmony上跑可以替换成鸿蒙原生支持的数据库插件,或者继续用sqflite的OpenHarmony适配版本。
天气模块负责定位城市、请求天气接口、解析天气数据。考虑到OpenHarmony上定位权限和定位服务的实现跟Android有差异,我在这一层做了接口抽象,上层业务只依赖一个WeatherService的抽象类,底层具体用哪个定位实现不影响业务代码。
穿搭推荐模块是整个系统里最核心的部分。它读取当天的天气数据和衣橱里的衣物列表,跑一遍规则引擎,生成穿搭方案,再用评分函数对方案排序。这一模块不依赖任何平台特性,纯Dart实现,所以在OpenHarmony和Android上跑出来的结果完全一致。
设置与辅助模块负责主题外观、App字体设置、衣物数据备份恢复等。我在这个模块里做了个全局主题管理器,可以动态切换主题色,这个思路其实跟我之前调Flutter的showLicensePage主题颜色是同一套机制——用ThemeData统一控制Material组件的颜色,替换掉默认的蓝色主调。
2.2 衣物数据模型设计
衣物数据模型是整个推荐系统的地基,设计得好不好直接决定推荐规则能不能跑起来。我最终定下的字段如下:
| 字段 | 类型 | 说明 |
|------|------
