theme_extension.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/scheduler.dart';
  3. import 'package:get/get.dart';
  4. import '../../../app/data/sp/ix_sp.dart';
  5. import '../ix_theme.dart';
  6. /// 响应式主题扩展
  7. /// 支持三种模式:system(跟随系统)、dark、light
  8. class ReactiveTheme {
  9. static final RxBool _isLightTheme = true.obs;
  10. /// 初始化主题状态
  11. static void init() {
  12. _updateThemeFromMode();
  13. }
  14. /// 根据当前模式更新主题
  15. static void _updateThemeFromMode() {
  16. final mode = IXSP.getThemeMode();
  17. bool isLight;
  18. switch (mode) {
  19. case 'light':
  20. isLight = true;
  21. break;
  22. case 'dark':
  23. isLight = false;
  24. break;
  25. case 'system':
  26. default:
  27. // 跟随系统
  28. final brightness =
  29. SchedulerBinding.instance.platformDispatcher.platformBrightness;
  30. isLight = brightness == Brightness.light;
  31. break;
  32. }
  33. _isLightTheme.value = isLight;
  34. }
  35. /// 获取当前主题状态
  36. static bool get isLightTheme => _isLightTheme.value;
  37. /// 获取初始 ThemeMode(用于 GetMaterialApp)
  38. static ThemeMode get initialThemeMode {
  39. final mode = IXSP.getThemeMode();
  40. switch (mode) {
  41. case 'light':
  42. return ThemeMode.light;
  43. case 'dark':
  44. return ThemeMode.dark;
  45. case 'system':
  46. default:
  47. return ThemeMode.system;
  48. }
  49. }
  50. /// 切换主题(legacy,保持兼容)
  51. static void toggleTheme() {
  52. _isLightTheme.value = !_isLightTheme.value;
  53. IXSP.setThemeIsLight(_isLightTheme.value);
  54. Get.changeThemeMode(_isLightTheme.value ? ThemeMode.light : ThemeMode.dark);
  55. }
  56. /// 设置主题模式
  57. static void setThemeMode(String mode) {
  58. IXSP.setThemeMode(mode);
  59. ThemeMode themeMode;
  60. bool isLight;
  61. switch (mode) {
  62. case 'light':
  63. themeMode = ThemeMode.light;
  64. isLight = true;
  65. break;
  66. case 'dark':
  67. themeMode = ThemeMode.dark;
  68. isLight = false;
  69. break;
  70. case 'system':
  71. default:
  72. themeMode = ThemeMode.system;
  73. final brightness =
  74. SchedulerBinding.instance.platformDispatcher.platformBrightness;
  75. isLight = brightness == Brightness.light;
  76. break;
  77. }
  78. _isLightTheme.value = isLight;
  79. IXSP.setThemeIsLight(isLight);
  80. Get.changeThemeMode(themeMode);
  81. }
  82. /// 设置主题(legacy,保持兼容)
  83. static void setTheme(bool isLight) {
  84. if (_isLightTheme.value != isLight) {
  85. _isLightTheme.value = isLight;
  86. IXSP.setThemeIsLight(isLight);
  87. Get.changeThemeMode(isLight ? ThemeMode.light : ThemeMode.dark);
  88. }
  89. }
  90. /// 响应式主题数据
  91. static ThemeData get theme =>
  92. IXTheme.getThemeData(isLight: _isLightTheme.value);
  93. }
  94. /// 扩展 GetX,添加响应式主题方法
  95. extension GetXThemeExtension on GetInterface {
  96. /// 响应式主题数据
  97. ThemeData get reactiveTheme => ReactiveTheme.theme;
  98. }