从 Android 组件化到 Flutter 组件化

一套统一的工程架构理解(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 的工程架构,本质上是一套东西。

相关推荐
未来之窗软件服务2 小时前
终端优先同步架构终端场景下轻量化、高可用通信模型-东方仙盟
架构·东方仙盟·阿雪技术观·网络震荡·dns污染·数据中继器·边界网关
2601_949970695 小时前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
独隅6 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
传奇开心果编程6 小时前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
flutter·移动开发·跨平台·dart·编程语言理论·编程框架·声明式ui
坐看风云变幻8 小时前
《系统架构师成长之路》第 8 期|微服务:单体拆分的时机、粒度与通信
微服务·架构·系统架构
程序员老刘9 小时前
你的Flutter项目要不要紧急升级3.47.8?
flutter·客户端
且随疾风前行.10 小时前
Paint Cavans高级绘制:[一]Paint画笔高级应用
android·ui
Figo_Cheung10 小时前
Figo潜空间层级认知理论:基于齐夫拓扑与黎曼几何的结构化模型研究
人工智能·架构·空间计算
洞见前行10 小时前
用 Tinker 热更新反向实现插件化:两个独立 APK 合二为一的原理详解
架构
Talyra4211 小时前
不想开会员,我写了一个记账 App
flutter