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

相关推荐
QING6188 小时前
简单说下Kotlin 作用域函数中 apply 和 also 为什么不能空安全调用?
android·kotlin·android jetpack
西西学代码8 小时前
Flutter---CustomPaint
学习·flutter
城东米粉儿8 小时前
着色器 (Shader) 的基本概念和 GLSL 语法 笔记
android
代码方舟8 小时前
Java微服务架构:基于天远家政风险报告接口打造合规用工平台
java·大数据·微服务·架构
智慧化智能化数字化方案8 小时前
解读113页企业信息化架构成熟度评估指标及能力提升【附全文阅读】
网络·安全·架构·企业信息化架构成熟度评估指标
火柴就是我9 小时前
flutter 实现文本贴图
flutter
儿歌八万首10 小时前
Jetpack Compose :封装 MVVM 框架
android·kotlin·compose
2501_9159214310 小时前
iOS App 中 SSL Pinning 场景下代理抓包失效的原因
android·网络协议·ios·小程序·uni-app·iphone·ssl
壮哥_icon10 小时前
Android 系统级 USB 存储检测的工程化实现(抗 ROM、抗广播丢失)
android·android-studio·android系统