登录流程已全部重构

This commit is contained in:
zhutao
2025-09-23 11:47:29 +08:00
parent a4992a063b
commit 8988b3feea
71 changed files with 2036 additions and 901 deletions

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
abstract class AppColorsBase {
/// 品牌主色
Color get primary;
Color get secondary;
// 灰度
Color get textPrimary;
Color get textSecondary;
// 扩展颜色
Color get success;
Color get warning;
Color get info;
Color get danger;
// 容器色
Color get surfaceContainerLowest;
Color get surfaceContainerLow;
Color get surfaceContainer;
Color get surfaceContainerHigh; //白色卡片 / item
}

View File

@@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'app_colors_base.dart'; // 假设你之前定义了 AppColorsBase
TextTheme buildTextTheme(AppColorsBase colors) {
return TextTheme(
// 标题层级
titleLarge: TextStyle(
fontSize: 22, // 比正文大6
fontWeight: FontWeight.w700,
color: colors.textPrimary,
),
titleMedium: TextStyle(
fontSize: 20, // 比正文大4
fontWeight: FontWeight.w700,
color: colors.textPrimary,
),
titleSmall: TextStyle(
fontSize: 18, // 比正文大2
fontWeight: FontWeight.w600,
color: colors.textPrimary,
),
// 正文字体
bodyLarge: TextStyle(
fontSize: 18, // 稍大正文
color: colors.textPrimary,
),
bodyMedium: TextStyle(
fontSize: 16, // 正文标准
color: colors.textPrimary,
),
bodySmall: TextStyle(
fontSize: 14, // 辅助正文
color: colors.textSecondary,
),
// 标签/提示文字
labelLarge: TextStyle(
fontSize: 14, // 比正文小一点
fontWeight: FontWeight.w500,
color: colors.textSecondary,
),
labelMedium: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: colors.textSecondary,
),
labelSmall: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w400,
color: colors.textSecondary,
),
);
}

View File

@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import 'app_colors_base.dart';
@immutable
class AppThemeExtension extends ThemeExtension<AppThemeExtension> {
final Color success;
final Color warning;
final Color danger;
final Color textSecondary;
const AppThemeExtension({
required this.success,
required this.warning,
required this.danger,
required this.textSecondary,
});
// 工厂方法,根据 AppColorsBase 创建
factory AppThemeExtension.fromColors(AppColorsBase colors) {
return AppThemeExtension(
success: colors.success,
warning: colors.warning,
danger: colors.danger,
textSecondary: colors.textSecondary,
);
}
@override
ThemeExtension<AppThemeExtension> copyWith({
Color? success,
Color? warning,
Color? danger,
Color? textSecondary,
}) {
return AppThemeExtension(
success: success ?? this.success,
warning: warning ?? this.warning,
danger: danger ?? this.danger,
textSecondary: textSecondary ?? this.textSecondary,
);
}
@override
AppThemeExtension lerp(AppThemeExtension? other, double t) {
if (other == null) return this;
return AppThemeExtension(
success: Color.lerp(success, other.success, t)!,
warning: Color.lerp(warning, other.warning, t)!,
danger: Color.lerp(danger, other.danger, t)!,
textSecondary: Color.lerp(textSecondary, other.textSecondary, t)!,
);
}
}
extension AppThemeExt on BuildContext {
AppThemeExtension get themeEx => Theme.of(this).extension<AppThemeExtension>()!;
Color get success => themeEx.success;
Color get warning => themeEx.warning;
Color get danger => themeEx.danger;
Color get textSecondary => themeEx.textSecondary;
}

View File

@@ -12,3 +12,4 @@ extension CustomColors on ColorScheme {
Color get primaryEnd => const Color(0xff06b6d4);
}

View File

@@ -1,30 +1,43 @@
import 'package:flutter/material.dart';
///颜色
final scheme = ColorScheme.fromSeed(
primary: Color(0xff3784f1),
seedColor: Color(0xff3885f2),
brightness: Brightness.light,
//卡片色
surface: Colors.white,
surfaceContainerLow: Color(0xFFF4F8FB),
surfaceContainer: Color(0xFFE9ECF3),
surfaceContainerHigh: Color(0xFFDDE2EA),
//颜色
onSurfaceVariant: Color(0xFF828282),
import 'base/app_colors_base.dart';
import 'base/app_text_style.dart';
import 'base/app_theme_ext.dart';
shadow: Color.fromRGBO(0, 0, 0, 0.1),
);
class AppTheme {
static ThemeData createTheme(AppColorsBase themeBase) {
final textTheme = buildTextTheme(themeBase);
return ThemeData(
useMaterial3: true,
primaryColor: themeBase.primary,
scaffoldBackgroundColor: themeBase.surfaceContainerHigh,
colorScheme: ColorScheme.fromSeed(
seedColor: themeBase.primary,
secondary: themeBase.secondary,
primary: themeBase.primary,
brightness: Brightness.light,
///字体
final textTheme = TextTheme(
titleLarge: TextStyle(fontSize: 24, fontWeight: FontWeight.w700, color: scheme.onSurface),
titleMedium: TextStyle(fontSize: 20, fontWeight: FontWeight.w700, color: scheme.onSurface),
titleSmall: TextStyle(fontSize: 16, fontWeight: FontWeight.w700, color: scheme.onSurface),
bodyLarge: TextStyle(fontSize: 18),
bodyMedium: TextStyle(fontSize: 16),
bodySmall: TextStyle(fontSize: 14),
labelLarge: TextStyle(fontSize: 16, color: scheme.onSurfaceVariant),
labelMedium: TextStyle(fontSize: 14, color: scheme.onSurfaceVariant),
labelSmall: TextStyle(fontSize: 12, color: scheme.onSurfaceVariant),
);
onSurfaceVariant: themeBase.textSecondary,
//背景色
surfaceContainerHigh: themeBase.surfaceContainerHigh,
surfaceContainer: themeBase.surfaceContainer,
surfaceContainerLow: themeBase.surfaceContainerLow,
surfaceContainerLowest: themeBase.surfaceContainerLowest,
),
textTheme: textTheme,
extensions: [AppThemeExtension.fromColors(themeBase)],
appBarTheme: AppBarTheme(
backgroundColor: Colors.white,
titleTextStyle: textTheme.titleMedium,
scrolledUnderElevation: 0,
),
);
}
}
// background = Color(0xFFFFFBFE); // 页面背景
// surface = Color(0xFFFFFFFF); // 卡片背景
// surfaceVariant = Color(0xFFFFF7E0); // 卡片高亮 / 强调背景
// surfaceTint = Color(0xFFFFEF97); // 可用于叠加高亮
// primaryContainer = Color(0xFFFFF8B0); // 小块强调背景
// secondaryContainer= Color(0xFFE3E5C0); // 次要强调

View File

@@ -0,0 +1,43 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import '../base/app_colors_base.dart';
class LightTheme extends AppColorsBase {
@override
Color get primary => const Color(0xff22BB9B);
@override
Color get secondary => const Color(0xffE8F5E9);
@override
Color get textPrimary => const Color(0xFF212121);
@override
Color get textSecondary => const Color(0xffa8aca4);
@override
Color get success => const Color(0xff57be80);
@override
Color get warning => const Color(0xffff9800);
@override
Color get info => const Color(0xff909399);
@override
Color get danger => const Color(0xfff44545);
@override
Color get surfaceContainerLowest => Color(0xffE0E0E0);
@override
Color get surfaceContainerLow => Color(0xffF0F0F0);
@override
Color get surfaceContainer => Color(0xffF5F5F5);
@override
Color get surfaceContainerHigh => Color(0xffFFFFFF);
}