Skip to content

主题、配色与动效 Theme, Colors & Motion

本章涵盖 flutter_miuix 的主题基础设施:MiuixTheme/MiuixSystemTheme 提供静态主题,MiuixThemeController 提供完整的动态取色(Monet);MiuixColors 定义 50+ 个 HyperOS 语义角色,MiuixTextStyles 定义 14 种预设字号;MiuixMotionfolmeSpring 提供与原版一致的弹簧与缓动曲线。

MiuixThemeData

不可变的 Miuix 主题数据,聚合 MiuixColorsMiuixTextStylesBrightness

字段 / 方法类型说明
colorsMiuixColors配色方案
textStylesMiuixTextStyles文本样式集
brightnessBrightness当前亮度模式
MiuixThemeData.light({colors, textStyles})工厂浅色主题;默认 lightColorScheme + defaultTextStyles
MiuixThemeData.dark({colors, textStyles})工厂深色主题;默认 darkColorScheme + defaultTextStyles
MiuixThemeData.of(brightness, {lightColors, darkColors, textStyles})工厂跟随系统亮度自动选择
copyWith({colors, textStyles, brightness})MiuixThemeData复制并覆盖部分字段

示例:

dart
final data = MiuixThemeData.light(
  colors: lightColorScheme().copy(primary: Color(0xFFFF6B35)),
);

MiuixTheme

向子树提供 MiuixThemeDataInheritedWidget

参数 / 方法类型默认值说明
dataMiuixThemeData必填主题数据
childWidget必填子树
MiuixTheme.of(context)MiuixThemeData取当前主题;未包裹时回退到 MiuixThemeData.light()
MiuixTheme.maybeOf(context)MiuixThemeData?不建立依赖的读取;未包裹返回 null

示例:

dart
MiuixTheme(
  data: MiuixThemeData.light(),
  child: MyApp(),
)

MiuixSystemTheme

根据 MediaQuery.platformBrightnessOf 自动套用浅色/深色主题的便捷组件。

参数类型默认值说明
lightMiuixColors?null(= lightColorScheme自定义浅色配色
darkMiuixColors?null(= darkColorScheme自定义深色配色
textStylesMiuixTextStyles?null(= defaultTextStyles自定义文本样式
childWidget必填子树

示例:

dart
MiuixSystemTheme(
  child: Builder(builder: (context) {
    final theme = MiuixTheme.of(context);
    return MaterialApp(
      theme: ThemeData(brightness: theme.brightness),
      home: const HomePage(),
    );
  }),
)

MiuixColorSchemeMode

配色模式枚举。

说明
system跟随系统亮度,使用静态 light/dark 配色
light强制浅色
dark强制深色
monetSystem跟随系统亮度 + Monet 动态取色
monetLight浅色 + Monet 动态取色
monetDark深色 + Monet 动态取色

monet* 模式:keyColor 非空时按种子同步生成(纯 HCT 计算);keyColor 为空时读平台壁纸(Android),其他平台回退固定种子 0xFF6750A4

MiuixThemeController

完整的主题控制器,按 MiuixColorSchemeMode 解析配色并向子树提供 MiuixTheme

参数类型默认值说明
colorSchemeModeMiuixColorSchemeModesystem配色模式
lightColorsMiuixColors?null(= lightColorScheme浅色静态配色
darkColorsMiuixColors?null(= darkColorScheme深色静态配色
textStylesMiuixTextStyles?null(= defaultTextStyles文本样式
keyColorColor?nullMonet 种子色;为 null 时走平台壁纸取色
colorSpecMiuixThemeColorSpecspec2021配色规范版本
paletteStyleMiuixThemePaletteStyletonalSpotMonet palette 风格
isDarkbool?null是否深色;null 时跟随系统
childWidget必填子树

Monet 取色流程

  1. keyColor 非空 → 同步调用 miuixColorsFromSeed(纯 HCT 计算,无平台通道)。
  2. keyColor 为空 → 异步调用 miuixPlatformDynamicColors(Android 壁纸;其他平台回退固定种子)。结果就绪前用 miuixMonetSystemColors 占位以避免闪烁。

示例:

dart
MiuixThemeController(
  colorSchemeMode: MiuixColorSchemeMode.monetSystem,
  keyColor: const Color(0xFF6750A4),
  child: MyApp(),
)

MiuixColors

Miuix 颜色方案。所有字段均不可空,可通过 copy 覆盖部分颜色;浅色/深色默认值由 lightColorScheme / darkColorScheme 提供,与 HyperOS 规范一致。

主要语义角色

字段说明
primary / onPrimary主色 / 主色上文字(Switch、Button、Slider)
primaryVariant / onPrimaryVariant主色变体(Card 用)
primaryContainer / onPrimaryContainer主色容器
secondary / onSecondary次级色 / 上文字
secondaryVariant / onSecondaryVariant次级变体
secondaryContainer / onSecondaryContainer次级容器
secondaryContainerVariant / onSecondaryContainerVariant次级容器变体
tertiaryContainer / onTertiaryContainer / tertiaryContainerVariant三级容器
error / onError错误色 / 上文字
errorContainer / onErrorContainer错误容器
background / onBackground / onBackgroundVariant应用背景 / 上文字 / 变体文字
surface / onSurface / surfaceVariantSurface 色 / 上文字 / 变体
onSurfaceSecondarySurface 上次级文字(80% alpha)
onSurfaceVariantSummary / onSurfaceVariantActionsSurface 变体上的摘要 / 操作文字
surfaceContainer / onSurfaceContainer / onSurfaceContainerVariantSurface 容器 / 上文字 / 变体文字
surfaceContainerHigh / onSurfaceContainerHigh高 Surface 容器
surfaceContainerHighest / onSurfaceContainerHighest最高 Surface 容器
outline描边 / 边框
dividerLine分隔线
windowDimming窗口遮罩色(Dialog / Dropdown / Spinner / BottomSheet)
sliderKeyPoint / sliderKeyPointForeground / sliderBackgroundSlider 关键点 / 前景 / 背景

禁用态颜色

字段说明
disabledPrimary / disabledOnPrimarySwitch 禁用主色 / 上文字
disabledPrimaryButton / disabledOnPrimaryButtonButton 禁用主色 / 上文字
disabledPrimarySliderSlider 禁用主色
disabledSecondary / disabledOnSecondary禁用次级色 / 上文字
disabledSecondaryVariant / disabledOnSecondaryVariant禁用次级变体 / 上文字
disabledOnSurface禁用 Surface 上文字

默认配色工厂

函数返回说明
lightColorScheme()MiuixColors默认浅色(primary=0xFF3482FF,background=白)
darkColorScheme()MiuixColors默认深色(primary=0xFF277AF7,background=0xFF242424

MiuixColors.copy(...)

复制并覆盖部分颜色,所有参数均可空,未传则保留原值。返回新的 MiuixColors 实例。

示例:

dart
final colors = lightColorScheme().copy(
  primary: const Color(0xFFFF6B35),
  background: const Color(0xFFFFFBF8),
);

MiuixTextStyles

Miuix 文本样式集。所有样式仅保留字号/字重/行高,颜色由 MiuixThemeonBackground 在运行时提供。

字段字号行高/字重用途
main17主文本
paragraph171.2em段落
body116正文 1
body214正文 2
button17按钮
footnote113脚注 1
footnote211脚注 2
headline117标题行 1
headline216标题行 2
subtitle14bold副标题
title132标题 1
title224标题 2
title320标题 3
title418标题 4

MiuixTextStyles.copy({...})

按字段复制覆盖,返回新实例。

defaultTextStyles()

返回与 Miuix 规范一致的默认样式集(即上表所有数值)。可单独传入 MiuixThemeData / MiuixSystemTheme / MiuixThemeControllertextStyles 参数以替换。

Monet 动态取色

MiuixThemeColorSpec

Material 配色规范版本。当前 material_color_utilities 0.13.0 仅实现 SPEC_2021,spec2025 在受支持的 palette 上语义等价请求 2025,但底层按 2021 生成(与原版"不支持则降级"路径一致)。

说明
spec2021Material You 2021 配色规范
spec2025Material You 2025 规范(当前等价于 spec2021)

MiuixThemePaletteStyle

Monet 动态配色的 palette 风格。

对应 DynamicScheme
tonalSpotSchemeTonalSpot(默认)
neutralSchemeNeutral
vibrantSchemeVibrant
expressiveSchemeExpressive
rainbowSchemeRainbow
fruitSaladSchemeFruitSalad
monochromeSchemeMonochrome
fidelitySchemeFidelity
contentSchemeContent

miuixColorsFromSeed({seed, colorSpec, paletteStyle, dark})

从种子色生成整套 miuix 配色。

参数类型默认值说明
seedColor必填种子色
colorSpecMiuixThemeColorSpecspec2021配色规范
paletteStyleMiuixThemePaletteStyletonalSpotpalette 风格
darkbool必填是否深色

返回 MiuixColors。流程:按 paletteStyle 选择对应的 DynamicScheme → 用 MaterialDynamicColors 提取 27 个 MD3 角色 → 经 mapMd3RolesToMiuixColors 映射为 miuix 颜色(带透明度的颜色合成到对应背景上,保证结果全不透明)。

miuixMonetSystemColors({dark})

默认 Monet 配色:固定种子 0xFF6750A4 + TonalSpot + Spec2021。也是所有非 Android 平台的 platformDynamicColors 回退。

miuixPlatformDynamicColors({dark})Future<MiuixColors>

平台动态取色。

  • Android(及支持的平台):通过 DynamicColorPlugin.getAccentColor 读系统壁纸/主题种子色,非空则用 miuixColorsFromSeed(TonalSpot + Spec2021)生成。
  • 其他平台或读取失败:回退 miuixMonetSystemColors(固定种子)。

平台通道是异步,故本函数返回 Future。UI 层(MiuixThemeController)在结果就绪前用 miuixMonetSystemColors 占位。

MiuixMonetRoles

MD3(Monet)动态配色的角色集合(27 个字段)。由 miuixColorsFromSeedDynamicScheme 提取后填充,再交给 mapMd3RolesToMiuixColors 转换为 MiuixColors

主要角色:primaryonPrimaryprimaryFixedonPrimaryFixederroronErrorerrorContaineronErrorContainerprimaryContaineronPrimaryContainersecondaryonSecondarysecondaryContaineronSecondaryContainertertiaryContaineronTertiaryContainerbackgroundonBackgroundsurfaceonSurfacesurfaceVariantsurfaceContainersurfaceContainerHighsurfaceContainerHighestoutlineoutlineVariantonSurfaceVariant

mapMd3RolesToMiuixColors(roles, {dark})

把 MD3(Monet)角色映射为 miuix MiuixColors。逐字段照搬原版映射;带透明度的 disabled / slider / onSurfaceSecondary 等通过 ensureOpaqueOver 合成到对应背景上,保证结果全不透明。

MiuixMotion

Miuix 常用动效曲线与弹簧集合,按 HyperOS 交互习惯分类。

字段 / 方法类型说明
standardDecelerateCurve标准缓出,用于进场/出现(DecelerateEasing(1.0)
standardAccelerateCurve标准缓入,用于退场/消失(AccelerateEasing(1.0)
sinOutCurve正弦缓出,用于柔和位移/缩放(SinOutEasing
pressSpringSpringDescription通用按压/状态切换(临界阻尼,response=0.35s)
bouncySpringSpringDescription弹性切换(轻微欠阻尼 0.85,response=0.45s,有自然回弹)

folmeSpring({damping, response})SpringDescription

由阻尼比 damping 与响应时间 response(秒)构造一个 SpringDescriptionstiffness = (2π/response)²

参数类型说明
dampingdouble阻尼比;1.0=临界,<1 欠阻尼(有回弹),>1 过阻尼
responsedouble响应时间(秒);越小越快

AccelerateEasing

加速曲线。factor=1 时为 y=x²factor 越大缓入越夸张。

dart
const curve = AccelerateEasing(1.0);

DecelerateEasing

减速曲线。factor=1 时为 1-(1-x)²factor 越大缓出越夸张。

SinOutEasing

正弦缓出曲线:sin(t·π/2)

完整动效示例:

dart
AnimationController(vsync: this)
  ..animateWith(
    SpringSimulation(
      folmeSpring(damping: 0.85, response: 0.45),
      0.0, 1.0, 0.0,
    ),
  );

// 或使用预设
AnimationController(vsync: this)
  ..animateTo(1.0, curve: MiuixMotion.standardDecelerate);

Released under the Apache-2.0 License.