别让 Flutter 项目变成套娃地狱:一次真实的踩坑重构记录
最近,我接手了一个 Flutter 项目,本来以为只是个小优化,结果一打开项目,整个人差点没在椅子上裂开....... 不用 Git,全靠 ZIP 文件传输,代码结构混乱,逻辑像迷宫,Widget 嵌套能套出四层地狱。
这篇文章,既是一次吐槽,也是一份 Flutter 架构最佳实践建议。如果你也在为别人的屎山擦屁股,那我们是同类人 🥲。
为啥这代码真的很烂?
随便贴一点当时的结构给你们感受一下 ↓↓↓
main.dart
├── MaterialApp()
│ └── StatelessWidget
│ └── StatefulWidget
│ └── main.dart
└── MaterialApp()
└── StatelessWidget
├── Enum
├── Model
└── 4x StatefulWidget
是的。
每个页面一个 main(),每个页面都重新跑一遍 MaterialApp,每个 Widget 都自己玩自己的状态和生命周期。
我只能说——这比用筷子夹叉子吃面还荒谬。
项目事故现场总结: 我花了三天时间(72 小时无差别重构),哭了两次,才勉强让这个项目能“启动+不炸”。
以下是我整理的后遗症汇总:
TIME_WASTED_REFACTORING_COUNTER = 72 小时
TIME_SCREAMING_WTF_COUNTER = 144 次
并且:
- 修掉了几十个内存泄露问题
- 合并了 20+ 多余页面组件
- 清理了至少 1000 行废弃注释
但依然有一些角落我不敢动……生怕一碰整个项目直接寄。
为什么这样写 Flutter 是错的?
| 错误写法 | 原因 |
|---|---|
每个页面都 main() | 会导致初始化冲突、重复逻辑、路由混乱 |
滥用 StatefulWidget | 导致状态冗余、数据难追踪,维护成本极高 |
| 多重 MaterialApp 嵌套 | 会重置主题、路由等配置,完全失控 |
| 不使用 Git | 没有版本控制就是灾难,协作地狱 |
| 模块命名混乱 | 找文件靠眼力,组件复用基本为零 |
正确的 Flutter 项目结构应该是这样:
lib/
├── main.dart // 唯一入口
├── app.dart // App 初始化 + MaterialApp
├── routes/ // 路由集中配置
│ └── route_config.dart
├── screens/ // 页面级 UI
│ ├── home_screen.dart
│ └── login_screen.dart
├── widgets/ // 可复用组件
│ ├── button.dart
│ └── custom_avatar.dart
├── models/ // 数据模型
├── services/ // 数据层(API 调用)
├── providers/ // 状态管理(Provider/Riverpod)
├── utils/ // 工具函数
└── constants/ // 全局常量定义
主入口 main.dart:
import 'package:flutter/material.dart';
import 'counter_button.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) => MaterialApp(
home: const CounterPage(),
theme: ThemeData(useMaterial3: true),
);
}
class CounterPage extends StatefulWidget {
const CounterPage({super.key});
@override
State<CounterPage> createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int count = 0;
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('计数器')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('$count', style: const TextStyle(fontSize: 48)),
const SizedBox(height: 20),
CounterButton(
label: '点我 +1',
onPressed: () => setState(() => count++),
),
],
),
),
);
}
分离组件 counter_button.dart
import 'package:flutter/material.dart';
class CounterButton extends StatelessWidget {
final String label;
final VoidCallback onPressed;
const CounterButton({
super.key,
required this.label,
required this.onPressed,
});
@override
Widget build(BuildContext context) => ElevatedButton(
onPressed: onPressed,
child: Text(label),
);
}
写代码不是堆砖头,而是做建筑设计。 哪怕你只是临时代码维护工,也值得站在架构师的角度看问题。
接手烂项目、整理屎山不是耻辱,反而是技能点暴涨的机会。 你会学会如何识别坏设计、如何理清混乱逻辑、如何写出更「为人着想」的代码。
这次 Flutter 重构让我更清楚地意识到:
✨ 坏代码不只是写得烂,它是在消耗别人的生命。
避免这些问题,其实只需要最基本的代码卫生:
- 一个清晰的入口
main() - 一致的项目结构
- 状态与视图分离
- 避免重复、冗余、嵌套地狱
- Git 是标配,不是选配
最后,如果你也在修别人留下的锅,别气馁。修得越多,你就越知道什么叫好的。
写好代码,是对同事的尊重,对自己时间的珍惜,对未来自己的保护。