flutter架 构项目基础
This commit is contained in:
@@ -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];
|
||||
@@ -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: '答题结果',
|
||||
),
|
||||
},
|
||||
);
|
||||
@@ -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: '答题结果',
|
||||
),
|
||||
},
|
||||
);
|
||||
Reference in New Issue
Block a user