theme_controller.dart 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/scheduler.dart';
  3. import 'package:get/get.dart';
  4. import '../../../../config/translations/strings_enum.dart';
  5. import '../../../data/sp/ix_sp.dart';
  6. /// 主题模式信息
  7. class ThemeModeInfo {
  8. final String code; // 'system', 'dark', 'light'
  9. final String name;
  10. ThemeModeInfo({required this.code, required this.name});
  11. }
  12. class ThemeController extends GetxController {
  13. /// 当前选中的主题模式
  14. final selectedMode = 'system'.obs;
  15. /// 主题模式列表
  16. List<ThemeModeInfo> get themeModes => [
  17. ThemeModeInfo(code: 'system', name: Strings.followSystem.tr),
  18. ThemeModeInfo(code: 'dark', name: Strings.darkMode.tr),
  19. ThemeModeInfo(code: 'light', name: Strings.lightMode.tr),
  20. ];
  21. @override
  22. void onInit() {
  23. super.onInit();
  24. // 加载当前主题模式
  25. selectedMode.value = IXSP.getThemeMode();
  26. }
  27. /// 选择主题模式
  28. void selectThemeMode(String mode) {
  29. if (selectedMode.value == mode) return;
  30. selectedMode.value = mode;
  31. IXSP.setThemeMode(mode);
  32. // 应用主题
  33. _applyTheme(mode);
  34. }
  35. /// 应用主题
  36. void _applyTheme(String mode) {
  37. ThemeMode themeMode;
  38. bool isLight;
  39. switch (mode) {
  40. case 'light':
  41. themeMode = ThemeMode.light;
  42. isLight = true;
  43. break;
  44. case 'dark':
  45. themeMode = ThemeMode.dark;
  46. isLight = false;
  47. break;
  48. case 'system':
  49. default:
  50. themeMode = ThemeMode.system;
  51. // 获取系统当前的主题
  52. final brightness =
  53. SchedulerBinding.instance.platformDispatcher.platformBrightness;
  54. isLight = brightness == Brightness.light;
  55. break;
  56. }
  57. // 更新 GetX 主题
  58. Get.changeThemeMode(themeMode);
  59. // 同步更新 legacy 的 isLight 标记(兼容旧代码)
  60. IXSP.setThemeIsLight(isLight);
  61. }
  62. }