貓哥說
如果你和我一樣長期面對電腦,分享幾個對眼睛有好處的經驗
- 竟可能的室內用自然光,關掉多餘的光源
- 顯示器解析度比例調小,字型大些
- 如果你需要更多螢幕空間,可以加一個輔助螢幕
- 可能的話去慢慢適應暗色主題
- 顏色調的對比度低些
- 連續工作 2 小時,起來走走 讓眼睛眺望下遠方
當然並不是所有人都適合,讓自己的眼睛舒服就行
這篇文章是告訴你如何通過 ThemeData 來全域性管理 Flutter 的介面樣式。
有一次我專案做完,已經通過了評審,然後產品和我說要調下樣式,刷的一下,給我了一個新的 sketch 設計稿,我的內心是抗拒的,但是隻能耐心的去分析這個新版的樣式標準,幸好設計師是一個設計學科的碩士做事還算規範。
然後我通過 ThemeData 解決了 90% 的問題,因為我在程式碼中儘可能的用官方元件,這樣在 ThemeData 中還能找到這個物件。
剩下的自定義元件,應為我有抽取公共元件,所以改改就完成了。
閱讀建議,你可以通過我的譯文大致的瞭解內容,如果感興趣可以通過原文細細品味,下方有原文連結。
老鐵記得 轉發 ,貓哥會呈現更多 Flutter 好文~~~~
微信群 ducafecat
b 站 space.bilibili.com/404904528
原文
程式碼
參考
正文
在很多 Flutter 原始碼和應用程式中,我觀察到一個反覆出現的實踐,即通過小部件引數直接新增自定義樣式,導致不一致的設計和額外的維護。作為一個個人的例子,我必須維護一個 Flutter 應用程式,其中所有標題有不同的字型大小(有時字型重量)。
在這篇文章中,我將解釋你的重要性的方式,你應該設計您的 Flutter 應用程式,尤其是關注的主題。
在您看來,這些“設定”頁面在程式碼方面的區別是什麼?
Settings page 設定頁面
應用程式主題的正確方法是什麼?
在上圖中,“設定”頁面共享完全相同的程式碼。在這個層次上,這四種設計之間沒有嚴格的區別。
這裡面沒有什麼神奇的東西: 所有的主題相關的東西都集中在更高的層次,在 MaterialApp widget 中。這個小工具允許你定義兩個主題,一個用於 light brightness,另一個用於 dark theme 模式。
此外,如果沒有給出任何價值,大多數小部件都會從中檢索它們的設計。
小部件正在從 ThemeData (大多數情況下)設定預設值
讓我們來看一個如何正確做到這一點的例子: Card widget。你可以觀察到在設定頁面的第三個例子中,形狀是直線而不是角。
而只有‘ child’屬性在程式碼中使用: Card (child: ...)
當你深入研究 Card 小部件是如何設計的時候,你會看到它的形狀是如何定義的。下面是有關 Card.shape 屬性的程式碼文件:
/// The shape of the card's [Material].
///
/// Defines the card's [Material.shape].
///
/// If this property is null then [CardTheme.shape] of [ThemeData.cardTheme]
/// is used. If that's null then the shape will be a [RoundedRectangleBorder]
/// with a circular corner radius of 4.0.
final ShapeBorder? shape;
複製程式碼
因此,為了確保“普通”卡片共享相同的設計,您必須定義自己的 ThemeData,並在 MaterialApp 小部件中使用它作為主題(或 darkTheme)。
ThemeData example() {
final base = ThemeData.dark();
final mainColor = Colors.lightBlue;
return base.copyWith(
cardColor: Color.lerp(mainColor, Colors.white, 0.2),
cardTheme: base.cardTheme?.copyWith(
color: Color.lerp(mainColor, Colors.black, 0.1),
margin: EdgeInsets.all(20.0),
elevation: 0.0,
shape: BeveledRectangleBorder(
borderRadius: BorderRadius.circular(14.0),
side: BorderSide(color: Colors.white24, width: 1)),
),
);
}
複製程式碼
上面的程式碼演示瞭如何更改卡片設計,但是您可以為來自 Flutter SDK 的幾乎所有小部件進行更改。此外,您應該將主題相關的內容集中到單個檔案中,因為 ThemeData 是一個巨大的資料結構。
主題資料涵蓋了所有的視窗小部件,對吧?
不幸的是,ThemeData 並不能覆蓋所有視窗小部件。例如,您不能在其中定義列表貼片設計。幸運的是,您可以通過 ListTileTheme 小部件實現這一點。
說明如何更改列表平鋪選定的顏色和填充,而無需在原始碼中顯式設定頁面。
通過 ListTileTheme,我們可以在不更改頁面程式碼一行的情況下重新定義選擇的標題/背景和前景色
ListView.builder(
itemBuilder: (context, index) {
final value = elements[index];
return ListTile(
selected: value == selected,
title: Text(value.title),
subtitle: Text(value.message),
leading: Icon(value.icon),
onTap: () => setState(() => selected = value),
);
},
itemCount: elements.length,
);
複製程式碼
正如您在程式碼中看到的,與設計沒有任何關係。它的優點是避免程式碼噪聲,使其簡潔易懂。另外,我喜歡的一點是我所有的方法都很小(少於 30 行)。
總結
在本文中,我們瞭解瞭如何將應用程式設計集中到 ThemeData 物件中。正如你所理解的,你可能需要閱讀很多 Flutter SDK 程式碼文件,但是當你或者其他同事需要維護它的時候,好處就來了:
- 避免程式碼重複
- 減少頁面中的程式碼,使程式碼更易於閱讀和理解
- 確保設計的一致性
但是正如你可能已經看到的,ThemeData 物件是一個非常大的結構,在不斷的演變中。所以,請密切關注它!
我在開始一個新專案時檢視 ThemeData
為了更進一步..
再給你兩個小建議!首先,如果您希望為您的元件之一進行特定的設計,而不是在構建方法中定製它,您可以將小部件包裝到 Theme 小部件中。
當您設計一個新的小部件時,您可能希望通過從 ThemeData 檢索主題資訊來模仿 SDK 小部件。您可能已經看到,從 ThemeData 繼承是不正確的方式。相反,您可以通過 InheritedTheme 小部件“擴充套件”它,並模仿它在 ListTileTheme 小部件中的實現方式。
像往常一樣,你可以在這裡找到本文使用的原始碼和 adobe 設計:
© 貓哥
往期
開源
GetX Quick Start
新聞客戶端
strapi 手冊譯文
微信討論群 ducafecat
系列集合
譯文
開源專案
Dart 程式語言基礎
space.bilibili.com/404904528/c…
Flutter 零基礎入門
space.bilibili.com/404904528/c…
Flutter 實戰從零開始 新聞客戶端
space.bilibili.com/404904528/c…
Flutter 元件開發
space.bilibili.com/404904528/c…
Flutter Bloc
space.bilibili.com/404904528/c…
Flutter Getx4
space.bilibili.com/404904528/c…