3、项目初始化:创建Flutter项目、目录结构规划、依赖管理、版本控制配置

好,咱们正式开始动手了。

这一章,说白了就是搭地基。地基稳不稳,直接决定你后面能盖多高的楼。我在好几个企业级项目里都见过那种「先跑起来再说」的初始化方式,结果到后期目录乱成一锅粥,依赖冲突改到想砸电脑。嗯,咱们今天就把这事一次性做对。

3.1 创建Flutter项目

创建项目本身很简单,一行命令的事:

flutter create --org com.yourcompany --project-name your_project .

这里我多说两句。--org 指定的是包名前缀,我建议直接用公司域名倒写,比如 com.blueocean。别小看这个,后面接第三方SDK、做平台配置的时候,这个值会到处出现。改起来?嗯,很麻烦。

还有,--project-name 一定要用小写+下划线。别问我为什么,Dart的包管理就这么规定的。我之前有个同事用了驼峰,结果pub get的时候报了一堆警告,排查了半天。

小技巧: 如果你用的是Android Studio或VS Code,直接在IDE里新建Flutter项目也行。但我个人习惯用命令行——干净、可控、不会生成多余的文件。

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 统一封装,改一个文件就够了。

核心原则: 各层之间单向依赖。UI层只能依赖数据层,数据层不能反向依赖UI层。说白了,就是让业务逻辑和界面解耦。

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             # 启动项目,看看能不能跑起来

如果这几步都过了,恭喜你,地基打好了。

下一章咱们开始搭架构,到时候这些目录结构就会真正派上用场。嗯,到时候见。