flutter架 构项目基础

This commit is contained in:
崔宝新
2026-09-04 15:22:20 +08:00
parent 70967229d0
commit 0c5aee59c0
265 changed files with 35484 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
import 'package:flutter/material.dart';
import 'brands/red_theme.dart';
import 'brands/sky_blue_theme.dart';
/// ============================================================
/// 【BrandTheme】品牌换肤 —— 抽象模型 + 注册表(与具体配置解耦)
///
/// 一、目录分工(解耦规则):
/// core/theme/brand_theme.dart ← 本文件:只定义"模型"(类/枚举)
/// 和"注册表"(有哪些品牌)
/// core/theme/brands/xxx_theme.dart← 每个品牌一个文件:只有"配置"
/// (BrandTheme 的具体参数)
/// 模型文件不写任何具体颜色;品牌文件不写任何逻辑。
///
/// 二、新增一套主题三步走:
/// 1. brands/ 下新建文件,定义 `const xxxTheme = BrandTheme(...)`;
/// 2. 本文件顶部 import + 注册表 brandThemes 里加一行;
/// 3. 需要的资源(banner/图标)放对应目录。
/// 页面/切换逻辑零改动——它们只消费"模型 + 注册表"。
///
/// 三、两级模型回顾:
/// 一级 = 品牌:seedColor 生成整套 Material 色板(全 App 共享);
/// 二级 = 页面细节(PageTheme):按页面层级区分背景/头部/强调色/
/// 标题/banner。页面只声明"我是哪个层级",从品牌对象查细节。
/// ============================================================
/// 页面层级:一级分类(新增层级 = 这里加枚举值 + 各品牌补配置)
enum PageLevel { home, detail, result }
/// 主题 ID 常量:注册表 key(BrandTheme.name)+ 品牌表 themeId 都引这里。
/// 好处:改名字一处生效;IDE 补全 + 拼写错直接编译报错(而不是静默兜底)。
abstract final class BrandNames {
static const skyBlue = 'SkyBlue';
static const red = 'Red';
}
/// 一级:品牌 = 全局色板 seed + 二级细节表
class BrandTheme {
const BrandTheme({
required this.name,
required this.seedColor,
required this.pages,
});
/// 品牌名(显示 + 持久化标识)
final String name;
/// 生成整套 Material 色板(primary/secondary/surface...)
final Color seedColor;
/// 二级:页面层级 → 该层级的页面细节
final Map<PageLevel, PageTheme> pages;
}
/// 二级:某个层级页面的细节(颜色 / 文案 / 专属资源)
class PageTheme {
const PageTheme({
required this.bg,
required this.headerBg,
required this.accent,
required this.title,
this.banner,
});
/// 页面背景色
final Color bg;
/// 头部/AppBar 色
final Color headerBg;
/// 本页强调色(按钮/选中态)
final Color accent;
/// 本页标题文案
final String title;
/// 本页专属 banner(资源路径,如 assets/img/banner_sky.png)
final String? banner;
}
/// 品牌注册表:切换页/持久化只遍历这里。
/// 新增品牌 = brands/ 加文件 + 这里加一行。
final List<BrandTheme> brandThemes = [skyBlueTheme, redTheme];
+34
View File
@@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import '../brand_theme.dart';
/// ============================================================
/// 【Red 主题】具体配置(只改这里,不动模型/页面)
///
/// 一套品牌的全部参数:seed 色 + 三个页面层级各自的细节。
/// 页面从 brand_theme.dart 的注册表拿它,切换 = 换 BrandTheme。
/// ============================================================
const redTheme = BrandTheme(
name: BrandNames.red,
seedColor: Color(0xFFEF4444),
pages: {
PageLevel.home: PageTheme(
bg: Color(0xFFFFF5F5),
headerBg: Color(0xFFEF4444),
accent: Color(0xFFDC2626),
title: '任务',
),
PageLevel.detail: PageTheme(
bg: Colors.white,
headerBg: Color(0xFFB91C1C),
accent: Color(0xFFB91C1C),
title: '课程详情',
banner: 'assets/img/banner_red.png',
),
PageLevel.result: PageTheme(
bg: Color(0xFFFEF2F2),
headerBg: Color(0xFF991B1B),
accent: Color(0xFF991B1B),
title: '答题结果',
),
},
);
+34
View File
@@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import '../brand_theme.dart';
/// ============================================================
/// 【SkyBlue 主题】具体配置(只改这里,不动模型/页面)
///
/// 一套品牌的全部参数:seed 色 + 三个页面层级各自的细节。
/// 页面从 brand_theme.dart 的注册表拿它,切换 = 换 BrandTheme。
/// ============================================================
const skyBlueTheme = BrandTheme(
name: BrandNames.skyBlue,
seedColor: Color(0xFF4FC3F7),
pages: {
PageLevel.home: PageTheme(
bg: Color(0xFFF0F9FF),
headerBg: Color(0xFF4FC3F7),
accent: Color(0xFF29B6F6),
title: '任务',
),
PageLevel.detail: PageTheme(
bg: Colors.white,
headerBg: Color(0xFF0288D1),
accent: Color(0xFF0288D1),
title: '课程详情',
banner: 'assets/img/banner_sky.png',
),
PageLevel.result: PageTheme(
bg: Color(0xFFE1F5FE),
headerBg: Color(0xFF0277BD),
accent: Color(0xFF0277BD),
title: '答题结果',
),
},
);