常见的 Flutter 项目文件夹结构:
1. 按 功能模块 或 页面(Screen) 分
这种结构按功能模块或页面来组织,每个页面和相关的业务逻辑都放在单独的文件夹中。适合大中型项目,可以清晰地分离每个页面或功能模块。
bash
lib/
├── main.dart
├── screens/ # 页面文件夹
│ ├── home/
│ │ ├── home_screen.dart
│ │ ├── home_viewmodel.dart
│ │ └── home_widget.dart
│ ├── profile/
│ │ ├── profile_screen.dart
│ │ └── profile_viewmodel.dart
│ └── settings/
│ ├── settings_screen.dart
│ └── settings_viewmodel.dart
├── widgets/ # 通用组件
│ ├── custom_button.dart
│ └── custom_card.dart
├── models/ # 数据模型
│ ├── user.dart
│ └── product.dart
├── services/ # 数据服务(如 API 请求)
│ └── api_service.dart
└── utils/ # 工具类
├── date_utils.dart
└── string_utils.dart
优点:
-
每个页面的代码(包括视图、状态管理、组件等)都放在一起,易于管理。
-
适用于 大型项目,当每个页面或者功能模块的复杂度较高时,这种结构能有效地管理业务逻辑。
缺点:
- 如果项目较小或者页面较简单,文件夹结构可能会过于复杂。
2. 按 组件类型 分
这种结构将项目按组件类型来组织,例如将页面(Page)、视图(View)、小部件(Widget)分开,适用于有很多复用组件的小型或中型项目。
bash
lib/
├── main.dart
├── pages/ # 页面文件夹
│ ├── home_page.dart
│ ├── profile_page.dart
│ └── settings_page.dart
├── widgets/ # 可复用的 UI 组件
│ ├── custom_button.dart
│ ├── custom_card.dart
│ └── avatar_widget.dart
├── models/ # 数据模型
│ ├── user.dart
│ └── product.dart
├── services/ # 数据服务
│ └── api_service.dart
└── utils/ # 工具类
├── date_utils.dart
└── string_utils.dart
优点:
-
页面和组件分离,页面专注于布局和逻辑,组件专注于 UI。
-
适用于 中小型项目,复用性较高,组件化开发。
缺点:
- 如果组件很多,可能会导致项目目录膨胀,查找文件时会变得困难。
3. 按 层级结构 分
这种方式将项目按 功能层级 来分,通常适用于有使用 MVVM 或 BLoC 状态管理的项目。例如,视图(UI)、模型(数据)、视图模型(状态管理)等都分开。
bash
lib/
├── main.dart
├── features/ # 功能模块
│ ├── home/ # Home 功能模块
│ │ ├── ui/ # UI 层
│ │ │ └── home_screen.dart
│ │ ├── models/ # 数据模型
│ │ │ └── home_model.dart
│ │ └── viewmodels/ # 视图模型
│ │ └── home_viewmodel.dart
│ └── profile/ # Profile 功能模块
├── common/ # 公共组件
│ ├── widgets/ # 通用组件
│ └── services/ # 服务,如 API 调用
├── models/ # 通用数据模型
└── utils/ # 工具类
优点:
-
各层职责明确,解耦度高,易于维护。
-
适合 复杂项目,尤其是使用 MVVM 或类似架构时,代码分层更为清晰。
缺点:
- 对于小项目来说,可能会显得结构过于复杂。
📝 总结:如何选择文件夹组织方式
-
按页面(Screen)分:
-
适合 中大型项目,每个页面或模块较为独立,易于管理。
-
页面较复杂时,所有相关逻辑(视图、状态、组件等)都可以放在一个文件夹中。
-
-
按组件类型分:
-
适合 中小型项目,且有较多可复用组件时。
-
页面和 UI 组件分离,便于复用和测试。
-
-
按层级结构分:
-
适合 复杂项目,有多个功能模块且涉及状态管理(MVVM、BLoC等)时。
-
功能和责任划分更清晰,易于协作和维护。
-
项目结构方案 | 结构说明 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
方案1:按页面分组 /pages/home_page.dart /pages/login_page.dart |
所有页面集中放在 pages/ 文件夹中,逻辑分散 |
- 简单易上手 - 适合新手和小项目 | - 页面耦合严重 - 缺乏模块边界 - 难扩展和维护 | 小型项目、原型开发 |
方案2:按功能模块分组(推荐) /features/home/ /features/login/ |
每个功能模块独立一个文件夹,内部包含 UI、逻辑、子组件等 | - 模块独立、结构清晰 - 易维护、扩展性强 - 符合 Flutter 的组件化理念 | - 初期可能稍繁琐 - 不适合强共享逻辑时 | 中大型项目、团队协作项目、推荐使用 |
方案3:按层分组(MVVM/BLoC) /views/ /viewmodels/ /models/ |
所有页面、逻辑、模型分别集中在不同层级目录 | - 解耦性强 - 易于测试和复用 - 适合严格架构项目 | - 初学者难上手 - 页面与逻辑分离不直观 - 增加开发复杂度 | 大型项目、企业项目、有架构规范的团队 |