Get.changeTheme切换主题
在 Flutter 中,主题是通过 ThemeData
控制的,比如:
- 字体
- 颜色
- 按钮风格
- AppBar 风格
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'GetX Theme Demo',
theme: ThemeData.light(), // 默认浅色主题
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("GetX Theme Demo")),
body: Center(
child: ElevatedButton(
onPressed: () {
// Get.isDarkMode:判断当前是否是暗色模式
if (Get.isDarkMode) {
// Get.changeTheme:可以在运行时切换主题,不需要重新构建整个 MaterialApp。
Get.changeTheme(ThemeData.light());
} else {
Get.changeTheme(ThemeData.dark());
}
},
child: const Text("切换主题"),
),
),
);
}
}
Get.changeThemeMode切换主题
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'GetX Theme Demo',
theme: ThemeData.light(), // 浅色主题长什么样
darkTheme: ThemeData.dark(), // 深色主题长什么样
themeMode: ThemeMode.system, // 现在用哪个(light / dark / system) :跟随系统
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("主题切换 Demo")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
// 浅色/深色切换
/* Get.isDarkMode:判断当前是否是暗色模式
true → 当前是 暗色模式
false → 当前是 浅色模式
Get.changeThemeMode(...): 切换应用的主题模式。
传入的参数是 ThemeMode,可以是:
ThemeMode.light → 强制浅色
ThemeMode.dark → 强制深色
ThemeMode.system → 跟随系统
*/
Get.changeThemeMode(
Get.isDarkMode ? ThemeMode.light : ThemeMode.dark,
);
},
child: const Text("切换浅色 / 深色"),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 切换为系统模式
Get.changeThemeMode(ThemeMode.system);
},
child: const Text("跟随系统"),
),
],
),
),
);
}
}
changeThemeMode和changeTheme的区别
Get.changeTheme(ThemeData theme)
- 作用:直接切换到指定的 主题对象(
ThemeData
)。 - 你需要自己定义一个完整的
ThemeData
,传进去。 - 适合 自定义主题 的情况。
示例:
Get.changeTheme(ThemeData.light()); // 强制浅色主题
Get.changeTheme(ThemeData.dark()); // 强制深色主题
Get.changeTheme(ThemeData(primarySwatch: Colors.purple)); // 自定义主题
👉 它是直接替换掉当前的 theme
,而不是通过 ThemeMode
。
Get.changeThemeMode(ThemeMode mode)
- 作用:切换 主题模式。
- 参数是枚举类型
ThemeMode
:ThemeMode.light
→ 强制浅色ThemeMode.dark
→ 强制深色ThemeMode.system
→ 跟随系统
示例:
Get.changeThemeMode(ThemeMode.dark); // 切换到深色模式
Get.changeThemeMode(ThemeMode.light); // 切换到浅色模式
Get.changeThemeMode(ThemeMode.system); // 跟随系统
👉 它依赖于你在 GetMaterialApp
里配置的:
GetMaterialApp(
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system, // 初始模式
)
总结
方法 | 作用 | 参数类型 | 使用场景 |
---|---|---|---|
Get.changeTheme | 直接替换当前主题 | ThemeData |
自定义主题、动态换色 |
Get.changeThemeMode | 切换主题模式 | ThemeMode |
在 light/dark/system 三个模式之间切换 |
theme vs. darkTheme vs. themeMode
theme: ThemeData.light()
这是 默认的浅色主题配置。
当
ThemeMode.light
时,应用会用这个主题。你可以用
ThemeData.light()
(Flutter 自带的默认浅色主题),也可以自己定义,比如:theme: ThemeData( brightness: Brightness.light, primarySwatch: Colors.blue, ),
darkTheme: ThemeData.dark()
这是 深色模式下的主题配置。
当
ThemeMode.dark
时,应用会用这个主题。你也可以自己定义:
darkTheme: ThemeData( brightness: Brightness.dark, primarySwatch: Colors.red, ),
themeMode: ThemeMode.system
- 控制 当前用哪个主题。
ThemeMode
是一个枚举,有三个取值:ThemeMode.light
→ 强制使用浅色(theme
)ThemeMode.dark
→ 强制使用深色(darkTheme
)ThemeMode.system
→ 跟随系统设置(白天浅色、晚上深色,或者根据手机系统主题切换)
👉 简单总结:
theme
= 浅色主题长什么样darkTheme
= 深色主题长什么样themeMode
= 现在用哪个(light / dark / system)