javascript
lib/
├── main.dart # 入口文件
├── app.dart # App 根组件、路由初始化
├── core/ # 核心基础层(不含业务)
│ ├── network/ # 网络层(dio封装、拦截器)
│ ├── storage/ # 本地存储(SharedPreferences/Hive)
│ ├── utils/ # 工具类(日期、格式化等)
│ ├── constants/ # 常量(颜色、尺寸、字符串)
│ └── extensions/ # Dart 扩展方法
├── common/ # 公共业务层
│ ├── widgets/ # 公共组件(Button、Dialog等)
│ ├── models/ # 公共数据模型
│ └── services/ # 公共服务(推送、埋点等)
├── routes/ # 路由管理(GoRouter/AutoRoute)
│ ├── app_router.dart
│ └── route_names.dart
├── features/ # 业务功能模块(按特性划分)
│ ├── home/
│ │ ├── data/ # 数据层(API、Repository)
│ │ ├── domain/ # 领域层(实体、用例)
│ │ └── presentation/ # 表现层(页面、组件、状态)
│ ├── player/
│ │ ├── data/
│ │ ├── domain/
│ │ └── presentation/
│ └── profile/
│ ├── data/
│ ├── domain/
│ └── presentation/
└── generated/ # 自动生成代码(json_serializable、l10n)
├── l10n/
└── assets.gen.dart
每个 features/xxx/presentation/ 内部通常还有:
javascript
presentation/
├── pages/ # 页面级 Widget
├── widgets/ # 该模块私有组件
├── bloc/ # 或 provider/、viewmodel/(状态管理)
└── binding/ # 依赖注入绑定(GetX风格)

核心理念差异
Flutter 是"一切皆 Widget"的组合模式,结构更偏向领域驱动设计(DDD),data / domain / presentation 三层分离是主流;
UniApp 继承 Vue 的"单文件组件"思想,结构更接近传统前端,页面即文件,配置驱动路由,上手门槛更低但大型项目的分层约束较弱。