一、先给你一张全局图(核心认知)
你现在只需要记住这张表:
| 维度 | mixin | 继承 | 组合 |
|---|---|---|---|
| 本质 | 能力拼装 | 类型扩展 | 对象协作 |
| 是否强耦合 | ❌ | ✅ | ❌ |
| 是否支持多重 | ✅ | ❌ | ✅ |
| 是否推荐 Flutter 使用 | ✅ 强烈推荐 | ⚠️ 少用 | ✅ |
| 典型场景 | 页面能力、工具能力 | Widget 体系 | Service / Repo |
一句话总结:
Flutter 的架构核心 = 组合 + mixin,而不是继承
二、mixin 在 Flutter 中到底解决什么问题?
Flutter 项目常见痛点
-
BasePage 越写越大
-
所有页面被迫继承一堆方法
-
一个小改动影响所有页面
-
逻辑无法拆分、复用困难
mixin 的本质作用
✅ 把"横向能力"从"纵向继承"中解耦出来
三、5 种工程级 mixin 设计范式(核心)
✅ 范式一:工具型 mixin(最基础)
适合:日志、Toast、埋点、格式化
Dart
mixin LogMixin {
void log(String msg) => debugPrint('[LOG] $msg');
}
✔ 简单
✔ 无状态
✔ 可随意混入
✅ 范式二:带约束的页面能力(最常用)
Dart
mixin PageLogMixin<T extends StatefulWidget> on State<T> {
void pageLog(String msg) {
debugPrint('[${widget.runtimeType}] $msg');
}
}
用途:
- 页面日志
- 埋点
- 生命周期增强
👉 这是 Flutter 官方推荐用法
✅ 范式三:资源管理型(强烈推荐)
这是中大型项目的核心。
Dart
mixin AutoDisposeMixin<T extends StatefulWidget> on State<T> {
final _disposers = <VoidCallback>[];
void addDisposer(VoidCallback d) => _disposers.add(d);
@override
void dispose() {
for (final d in _disposers.reversed) {
d();
}
super.dispose();
}
}
适用:
- AnimationController
- StreamSubscription
- Timer
- FocusNode
👉 这是替代 BasePage 的关键武器
✅ 范式四:行为增强型(状态 + 行为)
Dart
mixin LoadingMixin {
bool _loading = false;
bool get isLoading => _loading;
void showLoading() => _loading = true;
void hideLoading() => _loading = false;
}
页面组合:
Dart
class _PageState extends State<Page>
with LoadingMixin, LogMixin, AutoDisposeMixin {}
👉 像搭积木一样组合能力
✅ 范式五:逻辑拆分型(替代 BasePage)
❌ 传统写法(不推荐):
Dart
abstract class BasePage extends StatefulWidget {
void init();
void loadData();
}
✅ mixin 写法(推荐):
Dart
mixin InitLogic on State {
void initLogic();
}
mixin LoadLogic on State {
Future<void> loadData();
}
页面自由组合:
Dart
class _PageState extends State<Page>
with InitLogic, LoadLogic {}
✔ 没有继承污染
✔ 高度解耦
✔ 可维护性强
四、mixin vs 继承 vs 组合(终极对比)
| 场景 | 推荐 |
|---|---|
| 页面能力复用 | ✅ mixin |
| 生命周期绑定 | ✅ mixin |
| 数据/服务对象 | ✅ 组合 |
| 类型体系 | ⚠️ 继承 |
| 多能力叠加 | ✅ mixin |
| 强业务逻辑 | ❌ mixin |
一句话记忆:
mixin 管能力,组合管对象,继承管类型
五、为什么 mixin 比 BasePage 更优雅?
| BasePage | mixin |
|---|---|
| 强耦合 | 松耦合 |
| 不可拆 | 可组合 |
| 层级固定 | 随需组合 |
| 难维护 | 易扩展 |
| 影响全局 | 影响局部 |
👉 BasePage 是"继承思维"
👉 mixin 是"架构思维"
六、mixin 的 5 个反模式(一定要避开)
❌ 把业务逻辑写进 mixin
❌ mixin 持有复杂状态
❌ mixin 之间相互依赖
❌ 一个 mixin 做太多事
❌ 把 mixin 当 BasePage 用
记住一句话:
mixin 只做"能力",不做"业务"
七、你现在该怎么用?(给你一套落地建议)
初级(现在就能做)
-
日志 mixin
-
dispose 管理 mixin
中级(工程化)
-
页面能力拆分
-
loading / error / lifecycle mixin
高级(架构级)
-
mixin + Riverpod
-
mixin + 页面模板
-
去 BasePage 化
八、最终总结
Flutter 的 mixin 不是语法糖,而是架构工具。
它解决的不是"少写代码",而是:
如何在不增加继承层级的前提下,让能力可复用、可组合、可维护。当你开始用 mixin 替代 BasePage,
说明你已经从"写页面",进阶到了"设计架构"。