GetX:切换主题

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)

×

喜欢就点赞,疼爱就打赏