关于 flutter-custom-design-system
这是一项面向 Flutter 开发者的技能,用于在已有自定义设计系统的项目中构建界面。它指导 Agent 复用项目的设计令牌、主题访问器和按压控件模式,避免套用默认 Material 样式或引入其他 UI 包。
主要功能
- 01识别现有设计系统约定
- 02将令牌集中在单一来源
- 03通过 ThemeExtension 挂载令牌
- 04所有点击使用项目 Pressable
- 05检查键值、分析器和界面效果
适用场景
- 01为品牌化 Flutter 应用构建界面
- 02扩展项目的设计令牌体系
- 03检查控件是否套用默认 Material 样式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ thesimpleapp/ flutter-app-skills --skill flutter-custom-design-system安装后在 Claude Code 中输入/flutter-custom-design-system确认已加载。
附带文件references/pressable.mdreferences/tokens.md
详细介绍
Flutter 自定义设计系统
这里不应默认使用标准 Material/Cupertino 风格。如果此仓库已经命名了颜色、字体、圆角、动效或可按压控件,请使用这些名称和值。除非用户要求弃用现有系统,否则不要将应用改成 FilledButton / NavigationBar / ColorScheme.fromSeed 风格。
配套技能:flutter-native-ui —— 仅适用于确实需要 Material 3 或 Cupertino 外观的应用。
参考资料
references/
tokens.md ThemeExtension mount, context accessor, 1:1 rule
pressable.md Scale/sink press, NoSplash, focus ring, semantics
先检测设计系统
编写组件前,先在仓库中搜索:
ThemeExtension<- 返回颜色或设计令牌的
extension <Name> on BuildContext - 名为
*tokens*、*semantics*、*theme*、WIDGETS.md、DESIGN-SYSTEM.md的文件 - 名为
*Pressable的组件 NoSplash.splashFactory/splashFactory: NoSplash
然后打开一个附近的生产页面,并照着使用其中的访问器(context.pt、St6Theme.of(context)、context.colors 等)。产品代码必须使用该访问器,不能另起一个。
如果尚无设计系统,而用户希望建立一个:按照 references/tokens.md 和 references/pressable.md 中的模式实施。一个令牌模块、一个扩展、一个可按压控件。不要添加第三方 UI 套件。
硬性规则
设计令牌
- 所有值必须集中在一个来源中(Dart 令牌文件、由 CSS/JSON 生成的文件,或经批准的
tokens.dart)。组件中不得包含原始十六进制颜色值、随意设定的圆角或临时添加的时长。 - 运行时通过
ThemeExtension<T>挂载到ThemeData.extensions,并提供一个统一的上下文访问器。不要在随机组件中导入FooColors类,与扩展并用。 - 与系统文件 1:1 对应。如果交接文档写的是
#C9A24B,令牌就必须是#C9A24B。不要“改进”对比度、臆造浅色主题,或添加系统未命名的角色。 - 缺少某个角色时:将其同时添加到令牌来源和扩展中,或者提出询问。绝不能为了省事直接在组件中写
#hex。 - 只有系统本身提供了深色模式,才可以实现深色模式。不要臆造深色调色板。
界面外观
- 外行不应看出这是默认的 Flutter Material 应用。除非系统明确规定,否则不要使用墨水波纹、M3 主容器胶囊样式或标准
NavigationBar指示器。 - 所有点击操作都必须通过项目自有的
Pressable(仓库中没有时就创建)。按压时缩放和/或下沉。主题和可按压控件上都要设置splashFactory: NoSplash.splashFactory及透明叠加层。 - 不要为了“免费获得无障碍功能”而用
FilledButton/ElevatedButton/InkWell包裹品牌控件,然后再设法去除水波纹。应将语义信息放在可按压控件上。 - 使用 Material 的行为(焦点、媒体查询、文本缩放器、
Shortcuts),不要使用 Material 的外观。
字体与间距
- 字体角色应来自系统(或扩展中的文本样式),除非系统已映射到
TextTheme,否则不要使用TextTheme.of(context).titleLarge。 - 间距、圆角和动效时长应使用令牌中的数值(
space200、radiusControl、durationPress)。不要在调用处臆造EdgeInsets.all(13)或Duration(milliseconds: 180)。
键与调试
- 交互控件:使用
const ValueKey<String>('kebab-name'),以便测试能调用find.byKey查找。 - 上帝模式、画廊、预填内容、跳转芯片:仅限
kDebugMode,且仍必须通过真实的身份验证/会话路径。不得设置发布版本后门。
不要
- 如果系统已经自带字体文件,就不要添加
google_fonts。如果需要比对图,应使用FontLoader加载这些字体——Roboto 比对图不代表产品字体。 - 不要添加
flutter_screenutil、GetX 或第二套设计包。 - 不要以“就这一次”为由,在品牌化界面上混用标准 M3 组件。
构建屏幕
- 阅读 token 文件、扩展、pressable,以及一个现有屏幕。
- 使用项目的 shell(自定义应用栏/标签栏)搭建,不要重新创建
AppBar+NavigationBar。 - 颜色、字体、间距、圆角、动效:仅使用扩展/tokens。
- 点击:使用项目的 pressable。图标:使用系统的图标集,除非
Icons.favorite就是系统指定图标。 - 安全区域和键盘:在内容上使用
SafeArea,以及MediaQuery.sizeOf/viewInsetsOf/textScalerOf。如果系统定义了窗口宽度断点,就使用这些断点;否则沿用现有 shell 的规则。 - 使用项目的分析器和运行中的画面进行验证。
何时拒绝 Material 默认样式
除非系统的组件清单列出了以下组件,否则不要在品牌化界面上使用:
FilledButton、NavigationBar、NavigationRail、NavigationDrawer、SnackBar(如果系统有 toast)、FloatingActionButton、Chip、Card、带 elevation tint 的 Material、使用默认 splash 效果的 InkWell。
如果系统未指定替代方案,不属于界面装饰的 OS 原生控件仍可使用 .adaptive()(Switch.adaptive、Checkbox.adaptive)。
验证
- 对你修改过的文件执行
grep,查找Color(0x/Color.from/#。匹配项应放在 token 文件中,而不是组件中。 - 每个新增的点击目标都必须使用项目的 pressable。
- 分析器检查通过。执行热重载。将运行中的画面与附近的品牌化屏幕进行比较,而不是凭对 Material 3 Gallery 的印象来判断。
- 只要存在 key,组件测试就使用
find.byKey,不要使用可见文案。