

该模板遵循 “清晰分层 + 预留扩展” 的原则,目标是:
这种“骨架先行”的方式非常适合用于企业级项目或长期维护的 MVP(最小可行产品)开发。
lib/
├── main.dart # 应用入口
├── app.dart # 根组件:主题、路由、全局配置
├── constants/ # 全局常量(颜色、尺寸、字符串等)
│ └── app_colors.dart
├── screens/ # 页面级组件(每个屏幕一个文件)
│ └── home_screen.dart
├── widgets/ # 可复用 UI 组件
│ └── app_bar_title.dart
└── utils/ # 工具类(日志、格式化、设备判断等)
└── logger.dart # 预留💡 为什么这样分?
screens/ 与 widgets/ 分离:页面负责业务逻辑,组件专注 UI 复用。constants/ 集中管理设计系统变量,便于后期接入 Design Token。utils/ 为通用逻辑(如时间格式、网络工具)提供存放地。main.dartimport 'package:flutter/material.dart';
import 'app.dart';
void main() {
runApp(const MyApp());
}runApp() 启动应用;MyApp(无状态,性能更优);🔜 扩展提示:未来若使用 Riverpod,只需在此处改为:
runApp(ProviderScope(child: MyApp()));app.dartclass MyApp extends StatelessWidget {
const MyApp({super.key});
static bool get isDarkMode => false; // ← 预留开关
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
debugShowCheckedModeBanner: false,
theme: ThemeData(...),
darkTheme: ThemeData(...),
themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light,
home: const HomeScreen(),
);
}
}theme:浅色主题;darkTheme:深色主题;themeMode:动态切换依据(当前硬编码为 false,但结构已支持动态切换)。useMaterial3: true 确保使用最新 Material Design 规范。routes 或未来改用 GoRouter。🔜 扩展路径:
isDarkMode 改为从 SharedPreferences 读取;themeMode。constants/app_colors.dartclass AppColors {
static const primary = Color(0xFF1976D2);
static const secondary = Color(0xFF424242);
}ThemeData 提供统一颜色源;✅ 最佳实践:后续可结合 Figma 设计系统,生成完整的
AppColors、AppSpacing、AppTextStyles。
widgets/app_bar_title.dartclass AppBarTitle extends StatelessWidget {
final String title;
const AppBarTitle({super.key, required this.title});
@override
Widget build(BuildContext context) {
return Text(
title,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
),
);
}
}required 参数确保调用时不会遗漏标题内容。💡 这种“小而专”的组件是构建大型应用 UI 的基石。
screens/home_screen.dart这是一个典型的 StatefulWidget 示例,包含:
_counter;setState 触发 UI 更新;Center + Column 适配手机/平板);ElevatedButton 和 FloatingActionButton 两种交互方式。主题感知文本:
style: Theme.of(context).textTheme.headlineMedium确保字体大小、颜色随主题自动变化。
语义化结构:
SizedBox 控制间距,而非硬编码 padding;ElevatedButton.icon,符合 Material 指南。⚠️ 当前局限:状态仅限本地。一旦页面重建或跳转,计数会重置。 ✅ 解决方案:引入状态管理(见下文)。
pubspec.yaml 配置说明environment:
sdk: '>=3.0.0 <4.0.0' # 使用 Dart 3,支持 records、patterns 等新特性
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.6 # iOS 风格图标(虽未用,但保留兼容性)
dev_dependencies:
flutter_lints: ^3.0.0 # 官方推荐代码规范检查uses-material-design: true:确保 Material 图标可用。测试

功能 | 实现方式 |
|---|---|
状态管理 | 在 main.dart 包裹 ProviderScope,创建 counterProvider(Riverpod) |
深色模式切换 | 将 isDarkMode 改为 StateProvider<bool>,AppBar 添加切换按钮 |
多页面导航 | 使用 GoRouter 或 Navigator 2.0 实现命名路由 |
网络请求 | 在 utils/api/ 下创建 ApiClient,集成 dio + retrofit |
本地存储 | 引入 shared_preferences,配合 FutureProvider 初始化用户设置 |
国际化 | 添加 l10n.yaml,运行 flutter gen-l10n,支持多语言 |
这个 Flutter 1.0 基础模板虽小,却“五脏俱全”:
它不是功能最全的脚手架,而是最干净、最克制、最面向未来的起点。无论是个人项目、创业 MVP,还是企业级应用,都可以以此为基础,稳步演进。
🌟 建议:将此模板保存为公司/团队的 Flutter Starter Kit,统一开发规范,提升交付效率。