
作者:晚霞的不甘 日期:2025年12月5日 标签:Flutter · OpenHarmony · 模块化 · Clean Architecture · 依赖注入 · 多团队协作 · 鸿蒙生态
初期,一个 Flutter + OpenHarmony 应用可能只有:
main.dart但随着业务扩张,代码迅速膨胀:
若缺乏清晰架构,项目将陷入:
模块化,不是可选项,而是大型项目的生存必需品。
本文基于 Clean Architecture + Feature-Sliced Design,结合 OpenHarmony 特性,提供一套高内聚、低耦合、易测试、可并行的模块化架构方案。
┌──────────────────────────────────────┐
│ Presentation Layer │ ← UI & 用户交互
│ ┌───────────┐ ┌─────────────────┐ │
│ │ Features │ │ Shared UI │ │
│ │ (独立业务)│ │ (通用组件/主题) │ │
└──┴───────────┴──┴─────────────────┴──┘
┌──────────────────────────────────────┐
│ Domain Layer │ ← 业务规则 & 实体
│ ┌───────────────────────────────┐ │
│ │ Use Cases / Entities │ │
└──┴───────────────────────────────┴──┘
┌──────────────────────────────────────┐
│ Data Layer │ ← 数据源实现
│ ┌───────────┐ ┌─────────────────┐ │
│ │ Features │ │ Shared Data │ │
│ │ (数据适配)│ │ (网络/DB/缓存) │ │
└──┴───────────┴──┴─────────────────┴──┘✅ 核心原则:
模块名 | 职责 | 示例 |
|---|---|---|
feature_health | 健康数据展示与分析 | 心率图表、睡眠报告 |
feature_navigation | 车机导航核心流程 | 路线规划、语音播报 |
feature_settings | 设置中心 | 账号、隐私、通知 |
每个 Feature 模块结构:
feature_health/
├── lib/
│ ├── presentation/ # 页面、Widget、ViewModel
│ ├── domain/ # UseCase、Entity
│ └── data/ # Repository 实现、DataSource
└── pubspec.yaml # 仅依赖 shared 模块和基础库模块 | 内容 |
|---|---|
shared_ui | 按钮、卡片、主题、响应式布局工具 |
shared_data | 网络客户端、数据库封装、缓存策略 |
shared_domain | 通用实体(User、Device)、全局 UseCase(Auth) |
shared_utils | 日期格式化、加密、日志 |
🔒 约束:Shared 模块必须 无业务逻辑,且 API 稳定。
# feature_health/pubspec.yaml
dependencies:
flutter:
sdk: flutter
shared_ui:
path: ../shared_ui
shared_data:
path: ../shared_data# 使用语义化版本
shared_ui: ^2.1.0# app/pubspec.yaml
dependencies:
feature_health: ^1.0.0
feature_navigation: ^1.0.0
shared_ui: ^2.1.0🛠️ 工具推荐:使用
melos管理多模块工作区,支持一键版本同步、发布。
// feature_health/lib/data/di.dart
final healthRepositoryProvider = Provider<HealthRepository>((ref) {
final remoteDataSource = ref.read(healthRemoteDataSourceProvider);
final localDataSource = ref.read(healthLocalDataSourceProvider);
return HealthRepositoryImpl(remoteDataSource, localDataSource);
});
final fetchHealthDataUseCaseProvider = Provider<FetchHealthDataUseCase>((ref) {
return FetchHealthDataUseCase(ref.read(healthRepositoryProvider));
});// app/lib/main.dart
void main() {
runApp(
ProviderScope(
overrides: [
// 注册所有 Feature 的 Provider
...healthDiOverrides,
...navigationDiOverrides,
],
child: MyApp(),
),
);
}✅ 优势:
feature_health 仅调用 ohos.health 相关 APIfeature_navigation 封装 ohos.car.navigation 能力OpenHarmony 允许一个应用包含多个 HAP(Harmony Ability Package):
模块化架构天然支持此模型:
main:稳定发布分支develop:集成分支feature/xxx:各模块独立开发分支CI 流程包含:
very_good_analysisFeature 开发 → 单元测试 → MR 合并 → 集成测试 → 发布 Shared/Feature 包 → 主应用升级// 使用 deferred import
import 'package:feature_health/health_page.dart' deferred as health;
ElevatedButton(
onPressed: () async {
await health.loadLibrary(); // 运行时加载
Navigator.push(context, MaterialPageRoute(builder: (_) => health.HealthPage()));
},
)💡 效果:首包体积减少 30%,启动速度提升
阶段 | 架构状态 | 行动 |
|---|---|---|
初创期 | 单体应用 | 抽离 shared_ui 和 shared_data |
成长期 | 3–5 个 Feature | 引入 DI,建立模块边界 |
成熟期 | 10+ Feature,多团队 | 拆分为独立 HAP,启用按需加载 |
生态期 | 开源部分模块 | 发布到私有 Pub 仓库 |
好的模块化架构,让:
🧱 行动建议:
shared_ui 模块feature_home因为可维护的代码,才是最有价值的资产。
附录:推荐目录结构
my_oh_app/
├── app/ # 根应用(聚合入口)
├── features/
│ ├── feature_health/
│ ├── feature_navigation/
│ └── feature_settings/
├── shared/
│ ├── shared_ui/
│ ├── shared_data/
│ ├── shared_domain/
│ └── shared_utils/
└── melos.yaml # 多模块管理配置复杂系统的优雅,在于模块间的默契,而非代码的堆砌。