一套统一的工程架构理解(MVVM + core + modules + domain)
很多架构概念之所以让人混乱,并不是它们本身复杂,而是同时被从不同维度讲 。
当你把维度拆清楚,Android 和 Flutter 在工程结构上,其实是同一套思想。
本文从一个 Android 工程师的视角,系统总结 MVVM、组件化、core、domain 在 Flutter 项目中的正确落位方式。
一、先说结论(重要)
Flutter 组件化 ≈ Android 组件化
只是:
Android 用 Gradle module
Flutter 用 package(本地 path 依赖)
除此之外,工程思想是完全一致的。
二、我们到底在解决什么问题?
不管 Android 还是 Flutter,一个中大型项目都会遇到同样的问题:
- 代码越来越多,边界模糊
- UI、业务规则、通信逻辑搅在一起
- 改一个业务规则,要动很多地方
- 技术(MQTT/TCP/网络)和业务强耦合
- 多人协作、长期维护成本高
这些问题,不是靠某个名词解决的 ,而是靠工程结构。
三、三个"正交维度",把所有概念一次理清
很多混乱,来自把不同维度的概念混在一起。
实际上我们讨论的所有东西,来自 3 个完全独立的维度。
维度 1:UI 架构 ------ MVVM(只管 UI)
MVVM 只解决一件事:UI 怎么组织
在 Flutter 中:
| MVVM 概念 | Flutter 对应 |
|---|---|
| View | Widget |
| ViewModel | Riverpod Notifier / Bloc / Cubit / ChangeNotifier |
| Model(UI State) | UiState / State 类 |
👉 MVVM 只存在于 UI 层
维度 2:工程组织 ------ 组件化(modules)
组件化 = 多模块依赖
-
Android:Gradle module
-
Flutter:package(path 依赖)
目标只有一个:
让工程按"业务 / 能力"拆分,而不是堆在一个工程里
维度 3:业务抽象 ------ domain(可选但强烈推荐)
Domain 的本质一句话:
把业务规则和业务流程抽出来,
让 UI 只"调用",不"判断"。
它带来的直接收益是:
- 规则只写一次
- 修改只在一个地方
- UI 更薄
- 技术实现可替换
四、core 和 modules 的正确定位
1️⃣ core 是什么?
core = 通用基础类库 / 能力库
特点:
- 不包含任何业务名词
- 可被多个业务模块复用
- 永远不反向依赖业务模块
典型内容:
- Result / Error / Logger / Utils
- 通用网络封装
- MQTT / TCP 通用连接能力
- 通用 UI 组件(可选)
2️⃣ modules 是什么?
modules = 业务模块集合
每一个 module 对应一个业务域,例如:
- robot
- auth
- device
业务模块里,才会出现:
- 页面
- ViewModel
- 业务规则
- 协议 / topic / CRC 等
五、domain 应该放在哪里?
结论非常明确:
domain 放在各自的业务 module 下面
而不是 core。
原因:
- domain 通常是业务专属规则
- 放 core 会污染"基础库"的纯度
- 修改业务规则不应该影响其他模块
典型结构(单业务模块)
modules/robot/
ui/ # Flutter MVVM
domain/ # 业务规则 / UseCase / Repository 接口
data/ # MQTT / TCP / 协议 / Repo 实现
六、Flutter 组件化的"最终标准结构"
一个主 App + 多个 package(与 Android 完全同构)
root/
app/ # ✅ 主 App(能 flutter run)
lib/main.dart
android/
ios/
pubspec.yaml
core/ # 通用基础库
core_base/
core_comm_mqtt/
core_comm_tcp/
modules/ # 业务模块
robot/
robot_ui/
robot_domain/
robot_data/
主 App 和 core / modules 同级
就像 Android 的 app 和其他 module 同级。
七、Flutter 里"谁是主 App"?
一眼判断标准:
-
✅ 有
lib/main.dart -
✅ 有
android/、ios/ -
✅ 能直接
flutter run
其他只有 lib/ + pubspec.yaml 的,都是 组件 package。
八、Flutter 的依赖方式(≈ Gradle)
Android(你熟的)
implementation(project(":robot"))
Flutter(等价)
dependencies:
robot_ui:
path: ../modules/robot_ui
👉 思想完全一致
九、domain 带来的"工程级价值"(解耦,统一入口)
你之前说的一句话非常关键:
domain 后期更好复用和维护,修改都在唯一地方,其他就是调用
工程化翻译就是:
- Single Source of Truth
- 统一业务入口(UseCase)
- UI 不再散落业务判断
- 技术切换(MQTT ↔ TCP)不影响业务
这是 domain 存在的真正理由,而不是"架构好看"。
十、最终统一总结(一句话版)
MVVM:只管 UI
组件化:工程拆模块
core:通用基础能力
modules:业务模块
domain:业务规则抽象(让 UI 只调用)
当你把这五点分清楚,
Android 和 Flutter 的工程架构,本质上是一套东西。