3、项目初始化:创建Flutter项目、目录结构规划、依赖管理、版本控制配置
好,咱们正式开始动手了。
这一章,说白了就是搭地基。地基稳不稳,直接决定你后面能盖多高的楼。我在好几个企业级项目里都见过那种「先跑起来再说」的初始化方式,结果到后期目录乱成一锅粥,依赖冲突改到想砸电脑。嗯,咱们今天就把这事一次性做对。
3.1 创建Flutter项目
创建项目本身很简单,一行命令的事:
flutter create --org com.yourcompany --project-name your_project .
这里我多说两句。--org 指定的是包名前缀,我建议直接用公司域名倒写,比如 com.blueocean。别小看这个,后面接第三方SDK、做平台配置的时候,这个值会到处出现。改起来?嗯,很麻烦。
还有,--project-name 一定要用小写+下划线。别问我为什么,Dart的包管理就这么规定的。我之前有个同事用了驼峰,结果pub get的时候报了一堆警告,排查了半天。
3.2 目录结构规划
项目创建完了,默认的目录结构长这样:
lib/
main.dart
test/
android/
ios/
web/
...
说实话,这个结构只适合demo。企业级项目?你得重新规划。
我推荐的分层结构是这样的:
lib/
├── app/ # 应用配置:主题、路由、国际化
│ ├── theme/
│ ├── router/
│ └── locale/
├── core/ # 核心基础设施
│ ├── constants/ # 常量、枚举
│ ├── utils/ # 工具类
│ ├── extensions/ # Dart扩展方法
│ └── network/ # 网络层封装
├── data/ # 数据层
│ ├── models/ # 数据模型
│ ├── repositories/ # 仓库层
│ └── datasources/ # 数据源(本地/远程)
├── features/ # 业务模块
│ ├── login/
│ │ ├── models/
│ │ ├── providers/
│ │ ├── screens/
│ │ └── widgets/
│ ├── home/
│ └── profile/
└── shared/ # 共享组件
└── widgets/ # 通用UI组件
你可能会问:为什么要分这么细?
我举个例子。之前有个项目,所有网络请求都写在页面里。后来要换接口域名,好家伙,全局搜索替换搞了整整一天,还漏了两个地方。如果用了 core/network 统一封装,改一个文件就够了。
3.3 依赖管理
Flutter用 pubspec.yaml 管理依赖。这个文件你天天都要打交道,我建议一开始就把它理清楚。
先看看我常用的依赖分类方式:
| 分类 | 示例 | 说明 |
|---|---|---|
| 核心依赖 | flutter_bloc, get_it | 架构层面的,几乎每个页面都用 |
| UI组件 | cached_network_image, shimmer | 界面展示相关的 |
| 网络层 | dio, retrofit | HTTP请求、数据解析 |
| 本地存储 | shared_preferences, hive | 缓存、持久化 |
| 工具类 | intl, equatable | 国际化、对象比较等 |
| 开发依赖 | flutter_lints, mockito | 只在dev环境使用 |
写依赖的时候,我建议锁定版本号。比如:
dependencies:
flutter:
sdk: flutter
dio: ^5.4.0
flutter_bloc: ^8.1.3
get_it: ^7.6.4
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.1
mockito: ^5.4.4
为什么要锁定版本?
我曾经遇到过这么个事:项目跑得好好的,某天同事拉完代码 pub get 之后,整个页面打不开了。查了半天,是一个依赖的小版本升级引入了breaking change。从那以后,我所有项目都明确指定版本号,至少锁定大版本。
pubspec.yaml。按需引入,用不到的库就别加。包体积和编译时间就是这么一点一点涨上去的。
3.4 版本控制配置
版本控制这块,我用Git。没什么好说的,行业标准。
关键在 .gitignore 文件。Flutter项目生成的时候会自带一个,但有些东西需要手动加:
# 常规
.DS_Store
*.log
# IDE
.idea/
*.iml
.vscode/
# Flutter
.packages
.pub/
build/
*.flutter-plugins
*.flutter-plugins-dependencies
# 本地配置
.env
*.local.yaml
# 依赖缓存
.pub-cache/
这里我特别想强调 .env 文件。很多项目会把API密钥、数据库地址写在代码里,然后直接提交到Git。这是个大坑。一旦仓库公开,这些敏感信息就全暴露了。
我的做法是:
- 在项目根目录放一个
.env.example,里面写占位符 - 真正的
.env加到.gitignore里 - 用
flutter_dotenv这个库来读取环境变量
另外,别忘了配置Git的全局用户信息:
git config --global user.name "Your Name"
git config --global user.email "your.email@company.com"
这个看似基础,但我见过太多人提交代码时用户名是空的,或者用的是个人邮箱。企业项目里,提交记录要能追溯到人,这是基本要求。
git init && git add . && git commit -m "chore: 项目初始化"。这样后面所有的改动都能清晰追踪。
3.5 验证一下
配置完了,跑几个命令确认一切正常:
flutter doctor # 检查环境
flutter pub get # 拉取依赖
flutter analyze # 静态分析,看看有没有潜在问题
flutter test # 跑一下默认测试
flutter run # 启动项目,看看能不能跑起来
如果这几步都过了,恭喜你,地基打好了。
下一章咱们开始搭架构,到时候这些目录结构就会真正派上用场。嗯,到时候见。