Flutter暗黑模式

1:provider管理暗黑模式


步驟一:編寫provider?管理全局Theme

extension ThemeModeExtensionon ThemeMode {

Stringget value => ['System', 'Light', 'Dark'][index];

}

class ThemeProviderextends ChangeNotifier {

void syncTheme() {

final String theme = SpUtil.getString(StringUtils.theme);

? ? if (theme.isNotEmpty && theme != ThemeMode.system.value) {

notifyListeners();

? ? }

}

void setTheme(ThemeMode themeMode) {

SpUtil.putString(StringUtils.theme, themeMode.value);

? ? notifyListeners();

? }

ThemeModegetThemeMode(){

final String theme = SpUtil.getString(StringUtils.theme);

? ? switch(theme) {

case 'Dark':

return ThemeMode.dark;

? ? ? case 'Light':

return ThemeMode.light;

? ? ? default:

return ThemeMode.system;

? ? }

}

ThemeDatagetTheme({bool isDarkMode =false}) {

return ThemeData(

errorColor: isDarkMode ? ColorR.dark_red : ColorR.red,

? ? ? brightness: isDarkMode ? Brightness.dark : Brightness.light,

? ? ? primaryColor: isDarkMode ? ColorR.dark_app_main : ColorR.app_main,

? ? ? accentColor: isDarkMode ? ColorR.dark_app_main : ColorR.app_main,

? ? ? // Tab指示器顏色

? ? ? indicatorColor: isDarkMode ? ColorR.dark_app_main : ColorR.app_main,

? ? ? // 頁面背景色

? ? ? scaffoldBackgroundColor: isDarkMode ? ColorR.dark_bg_color : Colors.white,

? ? ? // 主要用于Material背景色

? ? ? canvasColor: isDarkMode ? ColorR.dark_material_bg : Colors.white,

? ? ? // 文字選擇色(輸入框復制粘貼菜單)

? ? ? textSelectionColor: ColorR.app_main.withAlpha(70),

? ? ? textSelectionHandleColor: ColorR.app_main,

//? ? ? textTheme: TextTheme(

//? ? ? ? // TextField輸入文字顏色

//? ? ? ? subtitle1: isDarkMode ? TextStyles.textDark : TextStyles.text,

//? ? ? ? // Text文字樣式

//? ? ? ? bodyText2: isDarkMode ? TextStyles.textDark : TextStyles.text,

//? ? ? ? subtitle2: isDarkMode ? TextStyles.textDarkGray12 : TextStyles.textGray12,

//? ? ? ),

//? ? ? inputDecorationTheme: InputDecorationTheme(

//? ? ? ? hintStyle: isDarkMode ? TextStyles.textHint14 : TextStyles.textDarkGray14,

//? ? ? ),

? ? ? appBarTheme:AppBarTheme(

elevation:0.0,

? ? ? ? color: isDarkMode ? ColorR.dark_bg_color : Colors.white,

? ? ? ? brightness: isDarkMode ? Brightness.dark : Brightness.light,

? ? ? ),

? ? ? dividerTheme:DividerThemeData(

color: isDarkMode ? ColorR.dark_line : ColorR.line,

? ? ? ? ? space:0.6,

? ? ? ? ? thickness:0.6

? ? ? ),

? ? ? cupertinoOverrideTheme:CupertinoThemeData(

brightness: isDarkMode ? Brightness.dark : Brightness.light,

? ? ? ),

? ? ? pageTransitionsTheme:NoTransitionsOnWeb(),

? ? );

? }

}

步驟二:在manin.dart中設置provider

@override

? Widget build(BuildContext context) {


? ? //全局的App主題管理

? return ChangeNotifierProvider(

create: (_)=>ThemeProvider(),

? ? ? child:Consumer(

builder: (_, provider, __) {

return? MaterialApp(


? ? ? ? theme: provider.getTheme(),

? ? ? ? darkTheme: provider.getTheme(isDarkMode:true),

? ? ? ? themeMode: provider.getThemeMode(),

? ? ? ? supportedLocales: Platform.isIOS ? ios : android,

? ? ? ? home:TabPage(),

? ? ? ? /// 因為使用了fluro悉患,這里設置主要針對Web

? ? ? );

? ? ? },

? ? ? )

);

? }

}

步驟三:在需要設置暗黑模式的地方使用

// dark表示淺色党觅,light表示深色篮迎,system?表示跟隨系統(tǒng)碰酝。

ThemeMode themeMode =? ThemeMode.system ;

/// 與上方等價楣黍,provider 4.1.0添加的拓展方法

context.read<ThemeProvider>().setTheme(themeMode);


最后:提供一個主題工具欄(用于判斷當前的主題)



class ThemeUtils {

///判斷當前主題是不是暗黑模式

? static boolisDark(BuildContext context) {

return Theme.of(context).brightness == Brightness.dark;

? }

static ColorgetDarkColor(BuildContext context, Color darkColor) {

return isDark(context) ? darkColor :null;

? }

static ColorgetIconColor(BuildContext context) {

return isDark(context) ? ColorR.dark_text :null;

? }

static ColorgetBackgroundColor(BuildContext context) {

return Theme.of(context).scaffoldBackgroundColor;

? }

static ColorgetDialogBackgroundColor(BuildContext context) {

return Theme.of(context).canvasColor;

? }

static ColorgetStickyHeaderColor(BuildContext context) {

return isDark(context) ? ColorR.dark_bg_gray_ : ColorR.bg_gray_;

? }

static ColorgetDialogTextFieldColor(BuildContext context) {

return isDark(context) ? ColorR.dark_bg_gray_ : ColorR.bg_gray;

? }

static ColorgetKeyboardActionsColor(BuildContext context) {

return isDark(context) ? ColorR.dark_bg_color : Colors.grey[200];

? }

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末揖赴,一起剝皮案震驚了整個濱河市寇窑,隨后出現(xiàn)的幾起案子惋增,更是在濱河造成了極大的恐慌,老刑警劉巖堕伪,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖庄,死亡現(xiàn)場離奇詭異,居然都是意外死亡欠雌,警方通過查閱死者的電腦和手機蹄梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富俄,“玉大人禁炒,你說我怎么就攤上這事』舯龋” “怎么了幕袱?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桂塞。 經常有香客問我凹蜂,道長,這世上最難降的妖魔是什么阁危? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任玛痊,我火速辦了婚禮,結果婚禮上狂打,老公的妹妹穿的比我還像新娘擂煞。我一直安慰自己,他們只是感情好趴乡,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布对省。 她就那樣靜靜地躺著蝗拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒿涎。 梳的紋絲不亂的頭發(fā)上哀托,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音劳秋,去河邊找鬼仓手。 笑死,一個胖子當著我的面吹牛玻淑,可吹牛的內容都是我干的嗽冒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼补履,長吁一口氣:“原來是場噩夢啊……” “哼添坊!你這毒婦竟也來了?” 一聲冷哼從身側響起箫锤,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤贬蛙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡偿洁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年屡江,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岔擂。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡位喂,死狀恐怖,靈堂內的尸體忽然破棺而出乱灵,到底是詐尸還是另有隱情塑崖,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布痛倚,位于F島的核電站规婆,受9級特大地震影響,放射性物質發(fā)生泄漏蝉稳。R本人自食惡果不足惜抒蚜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耘戚。 院中可真熱鬧嗡髓,春花似錦、人聲如沸收津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至长捧,卻和暖如春嚣鄙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背串结。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工哑子, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奉芦。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓赵抢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親声功。 傳聞我的和親對象是個殘疾皇子烦却,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354