我在一家不用 Git、只传 Zip 的公司里,维护了一坨 Flutter 的代码地狱

0 阅读3分钟

别让 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 是标配,不是选配

最后,如果你也在修别人留下的锅,别气馁。修得越多,你就越知道什么叫好的。


写好代码,是对同事的尊重,对自己时间的珍惜,对未来自己的保护。