import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constants/app_constants.dart'; import '../../../services/get/theme_controller.dart'; /// 时间: 2026-03-27 /// 功能: 桌面小卡片设置页面 /// 介绍: 用于配置和管理桌面小卡片 class WidgetsPage extends StatefulWidget { const WidgetsPage({super.key}); @override State createState() => _WidgetsPageState(); } class _WidgetsPageState extends State { final ThemeController _themeController = Get.find(); bool _enableWidget = true; bool _showWeather = true; bool _showQuote = true; bool _showTime = true; int _updateInterval = 5; // 分钟 final List _intervalOptions = [1, 5, 10, 30, 60]; @override Widget build(BuildContext context) { return Obx(() { final isDark = _themeController.isDarkMode; final primaryColor = _themeController.currentThemeColor; return Scaffold( backgroundColor: isDark ? const Color(0xFF1A1A1A) : const Color(0xFFF5F5F5), appBar: AppBar( title: Text( '桌面卡片设置', style: TextStyle(color: primaryColor, fontWeight: FontWeight.bold), ), backgroundColor: isDark ? const Color(0xFF2A2A2A) : Colors.white, elevation: 0, centerTitle: true, leading: IconButton( icon: Icon(Icons.arrow_back, color: primaryColor), onPressed: () => Navigator.of(context).pop(), ), ), body: ListView( padding: const EdgeInsets.all(16), children: [ _buildSettingsGroup('卡片状态', [ _buildSwitchItem( '启用桌面卡片', '在桌面上显示诗词卡片', Icons.widgets, _enableWidget, (value) => setState(() => _enableWidget = value), isDark, ), ], isDark), const SizedBox(height: 16), _buildSettingsGroup('显示内容', [ _buildSwitchItem( '显示天气', '在卡片上显示当前天气', Icons.cloud, _showWeather, (value) => setState(() => _showWeather = value), isDark, ), _buildSwitchItem( '显示诗句', '在卡片上显示随机诗句', Icons.edit_document, _showQuote, (value) => setState(() => _showQuote = value), isDark, ), _buildSwitchItem( '显示时间', '在卡片上显示当前时间', Icons.access_time, _showTime, (value) => setState(() => _showTime = value), isDark, ), ], isDark), const SizedBox(height: 16), _buildSettingsGroup('更新设置', [_buildIntervalItem(isDark)], isDark), const SizedBox(height: 16), _buildSettingsGroup('预览', [_buildPreviewCard(isDark)], isDark), const SizedBox(height: 32), _buildActionButton(isDark), ], ), ); }); } Widget _buildSettingsGroup(String title, List items, bool isDark) { final primaryColor = _themeController.currentThemeColor; return Container( decoration: BoxDecoration( color: isDark ? const Color(0xFF2A2A2A) : Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(isDark ? 30 : 5), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.fromLTRB(16, 16, 16, 8), child: Text( title, style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: primaryColor, ), ), ), ...items, ], ), ); } Widget _buildSwitchItem( String title, String subtitle, IconData icon, bool value, ValueChanged onChanged, bool isDark, ) { final primaryColor = _themeController.currentThemeColor; return ListTile( leading: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: primaryColor.withAlpha(10), borderRadius: BorderRadius.circular(8), ), child: Icon(icon, color: primaryColor, size: 20), ), title: Text( title, style: TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: isDark ? Colors.white : Colors.black, ), ), subtitle: Text( subtitle, style: TextStyle( fontSize: 12, color: isDark ? Colors.grey[400] : Colors.grey[600], ), ), trailing: Switch( value: value, onChanged: onChanged, activeThumbColor: primaryColor, ), ); } Widget _buildIntervalItem(bool isDark) { final primaryColor = _themeController.currentThemeColor; return ListTile( leading: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: primaryColor.withAlpha(10), borderRadius: BorderRadius.circular(8), ), child: Icon(Icons.refresh, color: primaryColor, size: 20), ), title: Text( '更新间隔', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: isDark ? Colors.white : Colors.black, ), ), subtitle: Text( '每 $_updateInterval 分钟更新一次', style: TextStyle( fontSize: 12, color: isDark ? Colors.grey[400] : Colors.grey[600], ), ), trailing: SizedBox( width: 150, child: SegmentedButton( segments: _intervalOptions.map((interval) { return ButtonSegment(value: interval, label: Text('$interval')); }).toList(), selected: {_updateInterval}, onSelectionChanged: (Set selection) { setState(() { _updateInterval = selection.first; }); }, style: ButtonStyle( visualDensity: VisualDensity.compact, backgroundColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) { return primaryColor; } return isDark ? Colors.grey[700] : Colors.grey[200]; }), foregroundColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) { return Colors.white; } return isDark ? Colors.white : Colors.black87; }), ), ), ), ); } Widget _buildPreviewCard(bool isDark) { final primaryColor = _themeController.currentThemeColor; return Container( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: primaryColor.withAlpha(90), borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(10), blurRadius: 5, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (_showTime) ...[ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text( '${DateTime.now().hour.toString().padLeft(2, '0')}:${DateTime.now().minute.toString().padLeft(2, '0')}', style: const TextStyle( color: Colors.white, fontSize: 14, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 12), ], if (_showQuote) ...[ Text( '床前明月光,疑是地上霜。', style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Text( '举头望明月,低头思故乡。', style: const TextStyle(color: Colors.white, fontSize: 16), ), const SizedBox(height: 8), Text( '— 李白《静夜思》', style: const TextStyle(color: Colors.white70, fontSize: 12), ), ], if (_showWeather) ...[ const SizedBox(height: 12), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Icon(Icons.sunny, color: Colors.white, size: 16), const SizedBox(width: 4), Text( '25°C', style: const TextStyle(color: Colors.white, fontSize: 14), ), ], ), ], ], ), ); } Widget _buildActionButton(bool isDark) { final primaryColor = _themeController.currentThemeColor; return SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('桌面卡片设置已保存'), backgroundColor: primaryColor), ); }, style: ElevatedButton.styleFrom( backgroundColor: primaryColor, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), elevation: 0, ), child: const Text( '应用设置', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.white, ), ), ), ); } }