跳到主要内容
menumenu tanreiexpand_morecontrasttranslate
tanreiexpand_more
开始使用WebReactSwiftUIJetpack ComposeFlutterReact Native预设你自己的设计系统与 AI 代理一起使用 Tanrei品牌设计令牌设计系统与定制Theme Studio颜色字体排印图标形状层级动效交互状态行为布局无障碍文字颜色令牌字阶令牌形状令牌层级令牌动效令牌状态令牌间距与度量令牌组件按钮主操作按钮分段按钮按钮组带菜单的按钮工具栏复制按钮复选框单选按钮开关纸片(Chip)菜单滑块滑块字段日历DateTimePicker字段组单选组复选框组下拉选择框下拉选择字段菜单栏文件上传文件选择器 进阶放置区文本输入框 进阶文本字段纸片字段字段组合框 进阶组合框字段数字输入框 进阶数字字段颜色输入框 进阶颜色字段一次性验证码输入框 进阶一次性验证码字段嵌入式文本输入框 进阶聊天输入栏卡片分隔线模态层 进阶对话框列表列表行底部面板侧边面板轮播代码块表格弹出框步骤折叠面板描述列表图示应用外壳页头树视图时间线图片预览调整手柄可调整大小的框滚动区域徽标进度指示器计量条数字滚动器加载指示器消息条(Snackbar)工具提示键盘快捷键标签(Tag)行内代码提示块(Callout)头像空状态标签组(Tag group)骨架屏文件项色块跑马灯文本标签页标签页视图应用栏导航栏导航抽屉搜索链接分页上一页/下一页链接步骤条面包屑目录链接卡片FAB 菜单状态Tanrei 是如何构建的参与贡献许可与致谢
首页开始使用Flutter

Flutter

把 Tanrei 添加到 Flutter 应用中。

content_copy以 Markdown 格式查看

tanrei 包是纯 Dart 实现。它提供 widget、可继承的 TanreiTheme 和生成的令牌常量,并且不依赖 MaterialApp 或 CupertinoApp;它在这两者之中都能工作,在普通的 WidgetsApp 中也可以。

尚未发布

tanrei 尚未发布到 pub.dev。一个平台在跟上当前的规格之后才会发布,在此之前 Flutter 的 CI 处于暂停状态。下文“从源码”一节展示如何从 chnotchy/tanrei 添加这个包;“发布之后”一节展示届时的安装方式。

安装

从源码

目前无法构建

Flutter 包尚未跟上当前的规格和令牌:它的源码是针对较早版本的生成令牌代码编写的,无法与现在的令牌代码一起编译。在它跟上之前,它的 CI 处于暂停状态,状态页面把它的组件标记为“待跟进”。下面的步骤说明如何把它添加到应用中;等这个包跟上之后,这些步骤就能用了。

把仓库克隆到你的应用旁边,再按路径依赖这个包:

flutter pub add "tanrei:{path: ../tanrei/packages/flutter}"

使用 flutter pub add "tanrei:{git: {url: https://github.com/chnotchy/tanrei, path: packages/flutter}}",就会跟随仓库,而不是本地的克隆。

发布之后

flutter pub add tanrei

使用

import 'package:flutter/widgets.dart';
import 'package:tanrei/tanrei.dart';

class DeployButton extends StatelessWidget {
  const DeployButton({super.key, required this.isDeploying, required this.onDeploy});

  final bool isDeploying;
  final VoidCallback onDeploy;

  @override
  Widget build(BuildContext context) {
    return TanreiTheme(
      data: TanreiThemeData.platform(context),
      child: TanreiButton(
        variant: TanreiButtonVariant.filled,
        onPressed: isDeploying ? null : onDeploy,
        child: const Text('部署'),
      ),
    );
  }
}

没有 disabled 标志。与 Flutter 自带的按钮一样,给 onPressed 传入 null 就会禁用按钮。

主题与对比度

TanreiThemeData.platform(context) 从 MediaQuery 读取亮度和高对比度标志。要固定它们,可以从一个常量出发再复制:

TanreiTheme(
  data: TanreiThemeData.dark.copyWith(contrast: TanreiContrast.high),
  child: const App(),
)

请把 TanreiTheme 放在导航器之上,让每个路由都能访问到它。

文本样式

TanreiTheme.of(context).system.typescale 以 TanreiTextStyle 令牌的形式保存着按层级命名的十六个文本样式:章节标题用 heading2,连续文本用 body,控件用 label。theme.textStyle(system.typescale.heading2)(或 token.toTextStyle())可以把它转换为 Flutter 的 TextStyle。theme.textStyle(token, emphasized: true) 是同一样式在其字重上加上该系列强调级差(typescale.emphasis)后的结果,手写的等价形式是 token.emphasized(system.typescale.emphasis);强调是一种字重,而不是另一个角色。角色及其与元素的对应关系参见字体排印。