自定义模板最佳实践
自定义模板是 flu-cli 最强大的功能之一,让你可以为团队创建统一的项目结构和规范。
为什么需要自定义模板?
团队统一
- ✅ 统一项目结构
- ✅ 统一代码风格
- ✅ 统一依赖版本
- ✅ 统一配置文件
提高效率
- ⚡ 快速创建项目
- 🚀 预配置常用功能
- 📦 预装常用依赖
- 🎯 减少重复工作
最佳实践
- 📝 内置团队规范
- 🔧 预配置开发工具
- 🎨 统一 UI 组件库
- 📚 包含项目文档
创建自定义模板
方式 1: 本地模板
适合快速测试和个人使用。
1. 创建模板目录
bash
mkdir my-flutter-template
cd my-flutter-template2. 初始化 Flutter 项目
bash
flutter create .3. 自定义项目结构
my-flutter-template/
├── lib/
│ ├── main.dart
│ ├── app.dart
│ ├── core/
│ │ ├── theme/
│ │ ├── router/
│ │ └── constants/
│ ├── shared/
│ │ ├── widgets/
│ │ └── utils/
│ └── features/
│ └── home/
├── assets/
│ ├── images/
│ └── fonts/
├── .vscode/
│ └── dart.code-snippets
├── pubspec.yaml
└── README.md4. 添加变量占位符
在需要替换的地方使用变量:
dart
// lib/main.dart
import 'package:flutter/material.dart';
import 'app.dart';
void main() {
runApp(const {{Name}}App());
}yaml
# pubspec.yaml
name: { { projectName } }
description: A new Flutter project by {{author}}.
dependencies:
flutter:
sdk: flutter
# 你的依赖5. 使用模板
bash
flu-cli new
# 选择: 新增自定义模板(本地)
# 输入: /path/to/my-flutter-template方式 2: Git 模板(推荐)
适合团队协作和版本管理。
1. 创建 Git 仓库
bash
# 在 GitHub/GitLab 创建仓库
# 例如: https://github.com/yourorg/flutter-template.git2. 克隆并初始化
bash
git clone https://github.com/yourorg/flutter-template.git
cd flutter-template
flutter create .3. 自定义项目
按照本地模板的方式自定义项目结构。
4. 提交到 Git
bash
git add .
git commit -m "Initial template"
git push origin main5. 使用模板
bash
flu-cli new
# 选择: 新增自定义模板(Git)
# 输入仓库: https://github.com/yourorg/flutter-template.git
# 输入分支: main模板结构建议
基础结构
flutter-template/
├── lib/
│ ├── main.dart # 应用入口
│ ├── app.dart # 应用配置
│ ├── core/ # 核心功能
│ │ ├── theme/ # 主题
│ │ ├── router/ # 路由
│ │ ├── constants/ # 常量
│ │ └── utils/ # 工具
│ ├── shared/ # 共享资源
│ │ ├── widgets/ # 通用组件
│ │ ├── models/ # 通用模型
│ │ └── services/ # 通用服务
│ └── features/ # 功能模块
│ └── home/ # 示例模块
├── assets/ # 资源文件
│ ├── images/
│ ├── fonts/
│ └── icons/
├── .vscode/ # VSCode 配置
│ ├── dart.code-snippets # 代码片段
│ ├── settings.json # 编辑器设置
│ └── launch.json # 调试配置
├── test/ # 测试文件
├── .gitignore
├── analysis_options.yaml # 代码分析配置
├── pubspec.yaml
└── README.md推荐包含的文件
1. VSCode 代码片段
.vscode/dart.code-snippets:
json
{
"Flutter Stateful Page": {
"prefix": "flu.stPage",
"body": [
"import 'package:flutter/material.dart';",
"import '${1:{{vm_import}}}';",
"",
"class {{Name}}Page extends StatefulWidget {",
" const {{Name}}Page({super.key});",
"",
" @override",
" State<{{Name}}Page> createState() => _{{Name}}PageState();",
"}",
"",
"class _{{Name}}PageState extends State<{{Name}}Page> {",
" late final {{Name}}ViewModel _viewModel;",
"",
" @override",
" void initState() {",
" super.initState();",
" _viewModel = {{Name}}ViewModel();",
" }",
"",
" @override",
" Widget build(BuildContext context) {",
" return Scaffold(",
" appBar: AppBar(title: const Text('{{title}}')),",
" body: const Center(child: Text('{{title}}')),",
" );",
" }",
"",
" @override",
" void dispose() {",
" _viewModel.dispose();",
" super.dispose();",
" }",
"}"
]
}
}2. 代码分析配置
analysis_options.yaml:
yaml
include: package:flutter_lints/flutter.yaml
linter:
rules:
- prefer_const_constructors
- prefer_const_literals_to_create_immutables
- avoid_print
- prefer_single_quotes
- sort_pub_dependencies3. README 模板
README.md:
markdown
# {{projectName}}
{{description}}
## 作者
{{author}}
## 开始使用
\`\`\`bash
flutter pub get
flutter run
\`\`\`
## 项目结构
\`\`\`
lib/
├── core/ # 核心功能
├── shared/ # 共享资源
└── features/ # 功能模块
\`\`\`
## 依赖
- provider: 状态管理
- http: 网络请求
- shared_preferences: 本地存储4. Git 忽略文件
.gitignore:
# Flutter
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
build/
# IDE
.idea/
.vscode/
*.iml
*.ipr
*.iws
# macOS
.DS_Store依赖管理
pubspec.yaml 配置
yaml
name: { { projectName } }
description: A new Flutter project by {{author}}.
publish_to: "none"
version: 1.0.0+1
environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
flutter:
sdk: flutter
# 状态管理
provider: ^6.0.0
# 网络请求
http: ^1.1.0
dio: ^5.0.0
# 本地存储
shared_preferences: ^2.2.0
# 路由
go_router: ^12.0.0
# UI 组件
flutter_screenutil: ^5.9.0
# 工具
intl: ^0.18.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
flutter:
uses-material-design: true
assets:
- assets/images/
- assets/icons/
fonts:
- family: CustomFont
fonts:
- asset: assets/fonts/CustomFont-Regular.ttf
- asset: assets/fonts/CustomFont-Bold.ttf
weight: 700依赖选择建议
必备依赖
- flutter: Flutter SDK
- flutter_lints: 代码规范
状态管理
选择一个:
- provider: 简单易用
- get: 全功能框架
网络请求
选择一个:
- http: 官方包,简单
- dio: 功能丰富,推荐
本地存储
- shared_preferences: 键值存储
- hive: NoSQL 数据库
- sqflite: SQL 数据库
路由
- go_router: 官方推荐
- auto_route: 代码生成
- fluro: 简单路由
变量占位符
支持的变量
| 变量 | 说明 | 示例 |
|---|---|---|
| 项目名称(snake_case) | my_app |
| 包名 | com.example.my_app |
| 作者名称 | Your Name |
| PascalCase | MyApp |
| camelCase | myApp |
使用示例
Dart 文件
dart
// lib/main.dart
import 'package:flutter/material.dart';
import 'app.dart';
/// {{projectName}} - Created by {{author}}
void main() {
runApp(const {{Name}}App());
}YAML 文件
yaml
# pubspec.yaml
name: { { projectName } }
description: A new Flutter project by {{author}}.Markdown 文件
markdown
# {{projectName}}
Created by {{author}}团队协作
1. 创建团队模板仓库
bash
# 组织仓库
https://github.com/your-org/flutter-template.git2. 定义团队规范
在 README.md 中说明:
- 项目结构
- 命名规范
- 代码风格
- 提交规范
3. 配置 CI/CD
.github/workflows/ci.yml:
yaml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
- run: flutter pub get
- run: flutter analyze
- run: flutter test4. 版本管理
使用 Git 分支管理不同版本:
bash
main # 稳定版本
develop # 开发版本
feature/* # 功能分支5. 团队使用
团队成员使用模板:
bash
flu-cli new my_project
# 选择团队模板模板维护
定期更新
更新依赖
bashflutter pub upgrade更新 Flutter SDK
bashflutter upgrade提交更新
bashgit add . git commit -m "chore: update dependencies" git push
版本标签
使用 Git 标签管理版本:
bash
git tag -a v1.0.0 -m "Version 1.0.0"
git push origin v1.0.0更新日志
维护 CHANGELOG.md:
markdown
# Changelog
## [1.1.0] - 2024-01-15
### Added
- 新增用户认证模块
- 新增网络请求封装
### Changed
- 更新 Flutter 到 3.16.0
- 更新依赖版本
### Fixed
- 修复路由问题常见问题
如何测试模板?
bash
# 使用模板创建测试项目
flu-cli new test_project
# 选择你的自定义模板
# 测试项目
cd test_project
flutter pub get
flutter run如何分享模板?
- Git 仓库: 推荐,易于版本管理
- 压缩包: 适合离线分享
- 文档: 提供详细说明
如何更新已使用模板的项目?
不建议自动更新。手动迁移:
- 对比新旧模板差异
- 手动更新需要的部分
- 测试确保功能正常
模板可以嵌套吗?
不支持。但可以:
- 创建基础模板
- 基于基础模板创建特定模板
示例模板
最小模板
适合快速原型:
minimal-template/
├── lib/
│ ├── main.dart
│ └── app.dart
├── pubspec.yaml
└── README.md标准模板
适合大多数项目:
standard-template/
├── lib/
│ ├── main.dart
│ ├── app.dart
│ ├── core/
│ ├── shared/
│ └── features/
├── assets/
├── .vscode/
├── pubspec.yaml
└── README.md企业模板
适合大型项目:
enterprise-template/
├── lib/
│ ├── main.dart
│ ├── app.dart
│ ├── core/
│ ├── shared/
│ ├── features/
│ └── config/
├── assets/
├── test/
├── .vscode/
├── .github/
├── docs/
├── pubspec.yaml
└── README.md