Flutter 中使用 Material 3 (You) 的动态主题颜色

介绍

在这篇博文中,我们将增强应用程序的主题,以使用从 Material 3 的操作系统定义的配色方案中获取的动态颜色。

在 Android 12 中,Material You 引入了 Material Design 的第三次迭代。Material 3 的主要功能之一是Dynamic Color,它允许用户为整个操作系统选择自己的配色方案,源自壁纸。

这导致一组原色、二次色和三次色在整个操作系统以及内置应用程序(如时钟、计算器,甚至一些谷歌应用程序(如照片))中保持一致。

您可能并不总是希望为您的应用程序实现这一点,尤其是如果您的应用程序需要遵循特定的品牌指南(并且如果颜色是您品牌的重要组成部分)。但是,在某些情况下,支持动态颜色主题可能有意义,具体取决于您的应用和品牌。

在这篇文章中,我们将使用dynamic_colorMaterial 团队提供的 Flutter 包来增强默认的 Flutter 计数器应用程序的动态颜色。

使用材料 3

在本教程中,我们将使用基本的 Flutter 计数器应用程序示例,但有一点小改动。我们将从以下更改提供的主题:

ThemeData(
    primarySwatch: Colors.blue,
)

对此:

ThemeData(
    colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blue),
    useMaterial3: true,
)

我们这样做是为了使用useMaterial3标志启用材料 3。到目前为止,并非 Flutter 中的所有小部件都是“Material 3-ready”,因此我们需要明确启用它。

我们替换primarySwatchcolorScheme,但它们实际上做同样的事情。但是,colorScheme现在实际上是配置颜色的首选方式。我们也这样做是因为我们将使用colorScheme动态颜色。

我们还添加了三个框,显示配色方案的主要颜色、次要颜色和三次颜色。这样我们就可以比较并查看一旦我们实现了动态颜色,配色方案会发生什么。

如果您好奇,这是我们的应用程序在此之前和之后的外观。


使用动态颜色

dynamic_color包裹_

Material 团队已经创建了一个包来帮助解决这个问题。它返回基于平台的动态颜色实现的 Material 颜色方案。这实际上不仅仅针对 Material 3 和 Android!

从包的GitHub 存储库页面,您可以从每个平台获得以下信息:

  • Android(12 及更高版本)- 来自壁纸的颜色
  • Linux - GTK+ 主题@theme_selected_bg_color
  • macOS - 应用强调色
  • 窗户 - 强调色或窗户/玻璃颜色

让我们安装软件包:

flutter pub add dynamic_color

或者,将其添加到您的pubspec.yaml

dependencies:
  dynamic_color: ^1.4.0

DynamicColorBuilder部件

现在让我们利用dynamic_color包来实际使用动态颜色。我们可以DynamicColorBuilder使用 构建器小部件来做到这一点,它使用引擎盖下的插件从操作系统获取动态颜色并返回浅色和深色配色方案。

DynamicColorBuilder({
    Key? key,
    required this.builder,
})

DynamicColorBuilder接受一个可选键并需要一个构建器,该构建器应该返回我们想要使用动态颜色增强的任何小部件。构建器小部件的签名如下所示:

Widget Function(
    ColorScheme? lightDynamic,
    ColorScheme? darkDynamic,
)

我们可以返回一个小部件,任何小部件,并且构建器包括一个浅色动态配色方案以及一个深色动态配色方案。两种配色方案都可以为空;如果操作系统不响应或平台不支持动态颜色(如旧的 Android 版本),则返回null.

使用动态配色方案

我们现在已经dynamic_color安装了包,并且知道DynamicColorBuilder小部件是如何工作的。让我们用它来利用系统的配色方案。

下面是build我们的根MyApp小部件的方法现在的样子:

@override
Widget build(BuildContext context) {
  return DynamicColorBuilder(builder: (lightColorScheme, darkColorScheme) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: lightColorScheme ?? _defaultLightColorScheme,
        useMaterial3: true,
      ),
      darkTheme: ThemeData(
        colorScheme: darkColorScheme ?? _defaultDarkColorScheme,
        useMaterial3: true,
      ),
      themeMode: ThemeMode.dark,
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  });
}

我们已经MaterialAppDynamicColorBuilder. 对于主题,我们将之前的替换colorScheme为建造者提供的浅色方案。我们还提供了一个darkTheme除了theme,它使用了构建器提供的深色方案。请注意,由于两种配色方案都可以为空,因此我们有默认配色方案,我们已将其提取为静态常量。

static final _defaultLightColorScheme =
    ColorScheme.fromSwatch(primarySwatch: Colors.blue);

static final _defaultDarkColorScheme = ColorScheme.fromSwatch(
    primarySwatch: Colors.blue, brightness: Brightness.dark);

这些正是我们之前所拥有的,另外还有我们以完全相同的方式定义的深色方案,以及dark亮度值。

就是这样!只需添加少量代码(如果不计算默认配色方案,则少于 10 行),我们就有了一个配色方案的主题,该配色方案会根据您的操作系统设置动态变化。这是它现在的样子:


如果您正在为您的应用程序实现此功能,请注意一点。在调试模式下,当应用程序第一次加载时,您可能会很快看到应用程序使用默认配色方案加载一瞬间,然后再使用动态配色方案刷新。不过不用担心,您的生产应用程序不会出现这种情况!

包起来

在本教程中,我们展示了如何在 Flutter 应用程序的主题中实现动态颜色,以利用 Android 12 中提供的 Material 3 或 You 动态颜色功能。

您可以在此处找到完整的源代码。

文章链接:https://dartling.dev/dynamic-theme-color-material-3-you-flutter

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容