当前位置: 首页 > news >正文

flutter使用getx实现主题色切换

第一步实现 我们先封装好 themeController进行控制

import 'package:flutter/material.dart'; import 'package:get/get.dart'; class ThemeController extends GetxController { // 主题模式:system / light / dark final _themeMode = ThemeMode.system.obs; ThemeMode get themeMode => _themeMode.value; // 主题色种子 final _seedColor = const Color(0xFF2196F3).obs; Color get seedColor => _seedColor.value; void setThemeMode(ThemeMode mode) { _themeMode.value = mode; Get.changeThemeMode(mode); } void setSeedColor(Color color) { _seedColor.value = color; // 切换主题色后,根据当前模式刷新对应主题 if (_themeMode.value == ThemeMode.dark) { Get.changeTheme(_buildDarkTheme()); } else { Get.changeTheme(_buildLightTheme()); } } ThemeData _buildLightTheme() { return ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: _seedColor.value, brightness: Brightness.light, ), useMaterial3: true, ); } ThemeData _buildDarkTheme() { return ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: _seedColor.value, brightness: Brightness.dark, ), useMaterial3: true, ); } ThemeData get lightTheme => _buildLightTheme(); ThemeData get darkTheme => _buildDarkTheme(); }


暗色和亮色 这是getx自带的

ElevatedButton( onPressed: () => themeController.setThemeMode(ThemeMode.dark), child: const Text("切换成暗黑"), ), const SizedBox(width: 20), ElevatedButton( onPressed: () => themeController.setThemeMode(ThemeMode.light), child: const Text("切换成亮色"), ),

实现多种颜色的主题色更改

Wrap( spacing: 12, runSpacing: 12, children: _colors.map((color) { return Obx(() { final selected = themeController.seedColor == color; return GestureDetector( onTap: () => themeController.setSeedColor(color), child: Container( width: 44, height: 44, decoration: BoxDecoration( color: color, shape: BoxShape.circle, border: Border.all( color: selected ? Colors.black : Colors.transparent, width: 3, ), ), child: selected ? const Icon(Icons.check, color: Colors.white, size: 24) : null, ), ); }); }).toList(), ), const SizedBox(height: 30), Obx( () => Text( "当前主题色:${_colorName(themeController.seedColor)}", style: Theme.of(context).textTheme.titleMedium, ), ), // 可选主题色 static const List<Color> _colors = [ Color(0xFF2196F3), // 蓝色 Color(0xFFF44336), // 红色 Color(0xFF4CAF50), // 绿色 Color(0xFFFF9800), // 橙色 Color(0xFF9C27B0), // 紫色 Color(0xFF795548), // 棕色 ]; String _colorName(Color color) { switch (color.value) { case 0xFF2196F3: return "蓝色"; case 0xFFF44336: return "红色"; case 0xFF4CAF50: return "绿色"; case 0xFFFF9800: return "橙色"; case 0xFF9C27B0: return "紫色"; case 0xFF795548: return "棕色"; } return "未知"; }
http://www.jsqmd.com/news/1271930/

相关文章:

  • AI模型压缩实战:从剪枝、量化到部署的完整指南
  • getdata()与getresult()函数的设计规范与工程实践
  • 从马斯克评价Anthropic看AI团队技术价值观与工程实践
  • Atari 2600电视广告分析:从市场教育到游戏营销策略演变
  • 软件工厂失败原因分析:工程化与创造性的平衡之道
  • Spring Security权限控制实战:AccessDeniedException解析与解决方案
  • 【单片机毕业设计推荐】基于 STM32 或 51 单片机的 WiFi 组网胎压监测系统设计与实现,基于 ESP8266 的分布式胎压采集与超限报警系统设计(022503)
  • WeMos D1 ESP8266避坑指南:从驱动安装到Web Server实战
  • Claude语音模式技术解析:从API接入到实战应用开发指南
  • 自己动手打造属于自己的智能家居(二)
  • SpringBoot高校科创项目管理系统设计与实现
  • 智能交通监控系统:YOLO与SpringBoot的深度实践
  • 2026年论文降AI率工具实测与技巧全解析
  • 条件随机场(CRF)相比 HMM 在序列标注任务中的优势是什么?
  • DRA7x嵌入式系统早期启动画面与无缝切换技术深度解析
  • TMS320C6474多核DSP外设实战:GPIO、JTAG、信号量与AIF配置详解
  • Unity中基于LineRenderer的鼠标画线功能实现与优化指南
  • 四天掌握六西格玛绿带思维:DMAIC实战指南
  • Superpowers系统:AI编程Agent的工程化革命与实践
  • 国产MOS管替代方案与选型实践指南
  • C++异常处理核心机制:从RAII、noexcept到强保证的实战指南
  • Claude与Codex语音功能对比:实时对话与批量处理的技术选型指南
  • AI内容去痕迹化:6步打造自然流畅的技术写作
  • Docker镜像跨服务器迁移全攻略
  • Dify RAG实战:构建企业数据治理知识库全指南
  • 嵌入式开发中的外设状态寄存器:TM4C129X硬件自检与驱动适配
  • 通过OpenRouter调用阿里Qwen TTS:API集成与语音合成实践
  • Petals分布式LLM推理框架:低显存运行千亿级大模型实战
  • Unity游戏结束界面开发:从UI设计到状态管理的完整实现
  • Windows本地部署OpenClaw AI开发框架全流程指南