Flutter 中使用 Material 3 (You) 的動態(tài)主題顏色

介紹

在這篇博文中驰后,我們將增強應(yīng)用程序的主題,以使用從 Material 3 的操作系統(tǒng)定義的配色方案中獲取的動態(tài)顏色非春。

在 Android 12 中袁勺,Material You 引入了 Material Design 的第三次迭代嫉拐。Material 3 的主要功能之一是Dynamic Color,它允許用戶為整個操作系統(tǒng)選擇自己的配色方案魁兼,源自壁紙婉徘。

這導致一組原色、二次色和三次色在整個操作系統(tǒng)以及內(nèi)置應(yīng)用程序(如時鐘咐汞、計算器盖呼,甚至一些谷歌應(yīng)用程序(如照片))中保持一致。

您可能并不總是希望為您的應(yīng)用程序?qū)崿F(xiàn)這一點化撕,尤其是如果您的應(yīng)用程序需要遵循特定的品牌指南(并且如果顏色是您品牌的重要組成部分)几晤。但是,在某些情況下植阴,支持動態(tài)顏色主題可能有意義蟹瘾,具體取決于您的應(yīng)用和品牌。

在這篇文章中掠手,我們將使用dynamic_colorMaterial 團隊提供的 Flutter 包來增強默認的 Flutter 計數(shù)器應(yīng)用程序的動態(tài)顏色憾朴。

使用材料 3

在本教程中,我們將使用基本的 Flutter 計數(shù)器應(yīng)用程序示例喷鸽,但有一點小改動众雷。我們將從以下更改提供的主題:

ThemeData(
    primarySwatch: Colors.blue,
)

對此:

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

我們這樣做是為了使用useMaterial3標志啟用材料 3。到目前為止做祝,并非 Flutter 中的所有小部件都是“Material 3-ready”砾省,因此我們需要明確啟用它。

我們替換primarySwatchcolorScheme混槐,但它們實際上做同樣的事情编兄。但是,colorScheme現(xiàn)在實際上是配置顏色的首選方式声登。我們也這樣做是因為我們將使用colorScheme動態(tài)顏色狠鸳。

我們還添加了三個框揣苏,顯示配色方案的主要顏色、次要顏色和三次顏色碰煌。這樣我們就可以比較并查看一旦我們實現(xiàn)了動態(tài)顏色舒岸,配色方案會發(fā)生什么绅作。

如果您好奇芦圾,這是我們的應(yīng)用程序在此之前和之后的外觀。


使用動態(tài)顏色

dynamic_color包裹_

Material 團隊已經(jīng)創(chuàng)建了一個包來幫助解決這個問題俄认。它返回基于平臺的動態(tài)顏色實現(xiàn)的 Material 顏色方案个少。這實際上不僅僅針對 Material 3 和 Android!

從包的GitHub 存儲庫頁面眯杏,您可以從每個平臺獲得以下信息:

  • Android(12 及更高版本)- 來自壁紙的顏色
  • Linux - GTK+ 主題@theme_selected_bg_color
  • macOS - 應(yīng)用強調(diào)色
  • 窗戶 - 強調(diào)色或窗戶/玻璃顏色

讓我們安裝軟件包:

flutter pub add dynamic_color

或者夜焦,將其添加到您的pubspec.yaml

dependencies:
  dynamic_color: ^1.4.0

DynamicColorBuilder部件

現(xiàn)在讓我們利用dynamic_color包來實際使用動態(tài)顏色。我們可以DynamicColorBuilder使用 構(gòu)建器小部件來做到這一點岂贩,它使用引擎蓋下的插件從操作系統(tǒng)獲取動態(tài)顏色并返回淺色和深色配色方案茫经。

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

DynamicColorBuilder接受一個可選鍵并需要一個構(gòu)建器,該構(gòu)建器應(yīng)該返回我們想要使用動態(tài)顏色增強的任何小部件萎津。構(gòu)建器小部件的簽名如下所示:

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

我們可以返回一個小部件卸伞,任何小部件,并且構(gòu)建器包括一個淺色動態(tài)配色方案以及一個深色動態(tài)配色方案锉屈。兩種配色方案都可以為空荤傲;如果操作系統(tǒng)不響應(yīng)或平臺不支持動態(tài)顏色(如舊的 Android 版本),則返回null.

使用動態(tài)配色方案

我們現(xiàn)在已經(jīng)dynamic_color安裝了包颈渊,并且知道DynamicColorBuilder小部件是如何工作的遂黍。讓我們用它來利用系統(tǒng)的配色方案。

下面是build我們的根MyApp小部件的方法現(xiàn)在的樣子:

@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'),
    );
  });
}

我們已經(jīng)MaterialAppDynamicColorBuilder. 對于主題俊嗽,我們將之前的替換colorScheme為建造者提供的淺色方案雾家。我們還提供了一個darkTheme除了theme,它使用了構(gòu)建器提供的深色方案绍豁。請注意榜贴,由于兩種配色方案都可以為空,因此我們有默認配色方案妹田,我們已將其提取為靜態(tài)常量唬党。

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

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

這些正是我們之前所擁有的,另外還有我們以完全相同的方式定義的深色方案鬼佣,以及dark亮度值驶拱。

就是這樣!只需添加少量代碼(如果不計算默認配色方案晶衷,則少于 10 行)蓝纲,我們就有了一個配色方案的主題阴孟,該配色方案會根據(jù)您的操作系統(tǒng)設(shè)置動態(tài)變化。這是它現(xiàn)在的樣子:


如果您正在為您的應(yīng)用程序?qū)崿F(xiàn)此功能税迷,請注意一點永丝。在調(diào)試模式下,當應(yīng)用程序第一次加載時箭养,您可能會很快看到應(yīng)用程序使用默認配色方案加載一瞬間慕嚷,然后再使用動態(tài)配色方案刷新。不過不用擔心毕泌,您的生產(chǎn)應(yīng)用程序不會出現(xiàn)這種情況喝检!

包起來

在本教程中,我們展示了如何在 Flutter 應(yīng)用程序的主題中實現(xiàn)動態(tài)顏色撼泛,以利用 Android 12 中提供的 Material 3 或 You 動態(tài)顏色功能挠说。

您可以在此處找到完整的源代碼。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愿题,一起剝皮案震驚了整個濱河市损俭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潘酗,老刑警劉巖杆兵,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異崎脉,居然都是意外死亡拧咳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門囚灼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骆膝,“玉大人,你說我怎么就攤上這事灶体≡那” “怎么了?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵蝎抽,是天一觀的道長政钟。 經(jīng)常有香客問我,道長樟结,這世上最難降的妖魔是什么养交? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瓢宦,結(jié)果婚禮上碎连,老公的妹妹穿的比我還像新娘。我一直安慰自己驮履,他們只是感情好鱼辙,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布廉嚼。 她就那樣靜靜地躺著,像睡著了一般倒戏。 火紅的嫁衣襯著肌膚如雪怠噪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天杜跷,我揣著相機與錄音傍念,去河邊找鬼。 笑死葱椭,一個胖子當著我的面吹牛捂寿,可吹牛的內(nèi)容都是我干的口四。 我是一名探鬼主播孵运,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔓彩!你這毒婦竟也來了治笨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赤嚼,失蹤者是張志新(化名)和其女友劉穎旷赖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更卒,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡等孵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹂空。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯萌。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖上枕,靈堂內(nèi)的尸體忽然破棺而出咐熙,到底是詐尸還是另有隱情,我是刑警寧澤辨萍,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布棋恼,位于F島的核電站,受9級特大地震影響锈玉,放射性物質(zhì)發(fā)生泄漏爪飘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一拉背、第九天 我趴在偏房一處隱蔽的房頂上張望师崎。 院中可真熱鬧,春花似錦去团、人聲如沸抡诞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昼汗。三九已至肴熏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顷窒,已是汗流浹背蛙吏。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鞋吉,地道東北人鸦做。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谓着,于是被迫代替她去往敵國和親泼诱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容