import 'package:app_settings/app_settings.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'dart:ui'; import 'dart:io'; import '../../../core/theme/app_colors.dart'; import '../controllers/settings_controller.dart'; import '../../../core/widgets/common_bottom_nav.dart'; import '../../../routes/app_routes.dart'; //import '../../../data/models/user_Info.dart'; import '../../common/webview_page.dart'; import '../../../modules/profile/controllers/profile_controller.dart'; import '../../profile/views/unified_avatar.dart'; class SettingsView extends GetView { const SettingsView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 直接使用 Theme.of(context) 获取当前主题 final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: AppBar( backgroundColor: isDarkMode ? Colors.black : Colors.white, elevation: 0.5, title: Text( 'settings'.tr, // 设置 style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), centerTitle: true, ), body: ListView( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), children: [ _buildUserInfoCard(isDarkMode), SizedBox(height: 12.h), _buildVipPurchaseCard(isDarkMode), // SizedBox(height: 20.h), // _buildAISettingsSection(isDarkMode), SizedBox(height: 16.h), _buildSystemSettingsSection(isDarkMode), SizedBox(height: 20.h), _buildAboutSection(isDarkMode), SizedBox(height: 10.h), ], ), bottomNavigationBar: const CommonBottomNav(currentIndex: 2), ); } // 用户信息卡片 Widget _buildUserInfoCard(bool isDarkMode) { final ProfileController profileCtrl = Get.find(); // 从GetX中获取ProfileController实例 return GestureDetector( onTap: () => Get.toNamed(Routes.editProfile), child: Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( gradient: LinearGradient( colors: isDarkMode ? [ const Color(0xFF1A1A1A).withOpacity(0.7), const Color(0xFF2A2A2A).withOpacity(0.7) ] : [const Color(0xFFE3F2FD), const Color(0xFFF3E5F5)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: isDarkMode ? Colors.black.withOpacity(0.2) : Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: ClipRRect( //裁剪圆角矩形 borderRadius: BorderRadius.circular(16.r), child: BackdropFilter( filter: isDarkMode ? ImageFilter.blur(sigmaX: 10, sigmaY: 10) : ImageFilter.blur(sigmaX: 0, sigmaY: 0), child: Row( children: [ // 使用统一头像组件,避免闪烁问题 UnifiedAvatarWithContainer( width: 60.w, height: 60.w, radius: 30.r, backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[200], iconColor: isDarkMode ? Colors.grey[400] : Colors.grey[600], iconSize: 30.r, isDarkMode: isDarkMode, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 8, offset: const Offset(0, 2), ), ], ), SizedBox(width: 16.w), Expanded( // 占据剩余空间 child: Obx( () => Column( crossAxisAlignment: CrossAxisAlignment.start, // 左对齐 children: [ Text( //用户名 profileCtrl.userInfo.value.name, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black87, ), overflow: TextOverflow.ellipsis, ), // SizedBox(height: 4.h), const Row( children: [ // Container( // padding: EdgeInsets.symmetric( // horizontal: 8.w, vertical: 2.h), // decoration: BoxDecoration( // color: Colors.blue[600], // borderRadius: BorderRadius.circular(10.r), // ), // child: Obx(() { // final membershipMap = { // 0: 'freeUser', //'免费用户' // 1: 'standardUser', //'标准用户' // 2: 'proUser', //'专业用户' // }; // final membershipString = membershipMap[ // profileCtrl.userInfo.value.viplv] ?? // 'Unknown'; // return Text( // membershipString.tr, // 会员等级 // style: TextStyle( // fontSize: 10.sp, // color: Colors.white, // ), // ); // }), // ), // SizedBox(width: 8.w), // Flexible( // child: Text( // '${'joinDevice'.tr} Voitrans Pro', // 已连接设备: // style: TextStyle( // fontSize: 12.sp, // color: isDarkMode // ? Colors.white70 // : Colors.black54, // ), // overflow: TextOverflow.ellipsis, // ), // ), ], ), SizedBox(height: 4.h), Text( 'ID:${profileCtrl.userInfo.value.uid}', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ), ), ), Container( // 编辑按钮 width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.white.withOpacity(0.7), borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 4, offset: const Offset(0, 1), ), ], ), child: InkWell( onTap: () => Get.toNamed(Routes.editProfile), child: Icon( Icons.edit, size: 16.w, color: isDarkMode ? Colors.white70 : Colors.grey[600], ), )), ], ), ), ), ), ); } // 构建Vip购买卡片 Widget _buildVipPurchaseCard(bool isDarkMode) { return Container( padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 12.h), decoration: BoxDecoration( gradient: LinearGradient( colors: isDarkMode ? [ const Color(0xFF0D47A1).withOpacity(0.5), const Color(0xFF1976D2).withOpacity(0.5) ] : [const Color(0xFFE3F2FD), const Color(0xFFBBDEFB)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: isDarkMode ? Colors.black.withOpacity(0.2) : Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'vipRecharge'.tr, // 会员充值 style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 12.h), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildCategoryItem( icon: Icons.workspace_premium, label: 'premiumMember'.tr, //AI充值 iconBg: isDarkMode ? Colors.amber[900]!.withOpacity(0.3) : Colors.amber[100]!, iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, textColor: isDarkMode ? Colors.white : Colors.black87, onTap: () => Get.toNamed(Routes.goodsvip), ), _buildCategoryItem( icon: Icons.translate, label: 'translationRecharge'.tr, //翻译充值 iconBg: isDarkMode ? Colors.indigo[900]!.withOpacity(0.3) : Colors.indigo[100]!, iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, textColor: isDarkMode ? Colors.white : Colors.black87, onTap: () => Get.toNamed(Routes.goodstrade), ), _buildCategoryItem( icon: Icons.people, label: 'meetingAssistantRecharge'.tr, //会议充值 iconBg: isDarkMode ? Colors.pink[900]!.withOpacity(0.3) : Colors.pink[100]!, iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, textColor: isDarkMode ? Colors.white : Colors.black87, onTap: () => Get.toNamed(Routes.goodsmeet), ), _buildCategoryItem( icon: Icons.cloud, label: 'cloudSync'.tr, //云端同步 iconBg: isDarkMode ? Colors.teal[900]!.withOpacity(0.3) : Colors.teal[100]!, iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, textColor: isDarkMode ? Colors.white : Colors.black87, onTap: () => {}, ), ], ), ], ), ); } Widget _buildCategoryItem({ required IconData icon, required String label, required Color iconBg, required Color iconColor, required VoidCallback onTap, Color? textColor, }) { return InkWell( onTap: onTap, child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( width: 42.w, height: 42.w, decoration: BoxDecoration( color: iconBg, borderRadius: BorderRadius.circular(21.r), ), child: Icon( icon, size: 20.w, color: iconColor, ), ), SizedBox(height: 5.h), SizedBox( width: 72.w, height: 32.h, child: Center( child: Text( label, textAlign: TextAlign.center, style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, color: textColor ?? (Get.isDarkMode ? Colors.white : Colors.black87), height: 1.2, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), ), ], ), ); } // AI设置 Widget _buildAISettingsSection(bool isDarkMode) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(left: 4.w, bottom: 8.h), child: Text( 'AIsettings'.tr, // AI设置 style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.blue[400] : Colors.blue[600], letterSpacing: 1, ), ), ), Container( decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.white, borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: isDarkMode ? Colors.black.withOpacity(0.2) : Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: ClipRRect( borderRadius: BorderRadius.circular(16.r), child: BackdropFilter( filter: isDarkMode ? ImageFilter.blur(sigmaX: 5, sigmaY: 5) : ImageFilter.blur(sigmaX: 0, sigmaY: 0), child: Column( children: [ // 语音服务选择 _buildSpeechServiceSetting(isDarkMode), Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), Obx( () => _buildNavigationSetting( title: 'timbreService'.tr, // 音色服务 subtitle: 'timbreServiceInfo'.tr, // 选择音色服务 icon: Icons.photo_camera_front_outlined, iconBgColor: isDarkMode ? Colors.cyan[900]!.withOpacity(0.3) : Colors.cyan[100]!, iconColor: isDarkMode ? Colors.cyan[300]! : Colors.cyan[600]!, value: controller.timbreName.value.tr, // 当前音色 valueStyle: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[500], ), onTap: () { Get.toNamed(Routes.timbre); }, isDarkMode: isDarkMode, ), ), Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // 实时对话入口 _buildSimpleNavigationSetting( title: 'realtimeVoiceChat'.tr, // 实时语音对话 subtitle: 'realtimeVoiceChatInfo'.tr, // 实时语音对话信息 icon: Icons.chat_bubble_outline, iconBgColor: isDarkMode ? Colors.purple[900]!.withOpacity(0.3) : Colors.purple[100]!, iconColor: isDarkMode ? Colors.purple[300]! : Colors.purple[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () { Get.toNamed(Routes.realtime); }, isDarkMode: isDarkMode, ), ], ), ), ), ), ], ); } // 系统设置部分 Widget _buildSystemSettingsSection(bool isDarkMode) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Padding( // padding: EdgeInsets.only(left: 4.w, bottom: 8.h), // child: Text( // 'systemSettings'.tr, // 系统设置 // style: TextStyle( // fontSize: 12.sp, // fontWeight: FontWeight.w500, // color: isDarkMode ? Colors.blue[400] : Colors.blue[600], // letterSpacing: 1, // ), // ), // ), Container( decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.white, borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: isDarkMode ? Colors.black.withOpacity(0.2) : Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: ClipRRect( borderRadius: BorderRadius.circular(16.r), child: BackdropFilter( filter: isDarkMode ? ImageFilter.blur(sigmaX: 5, sigmaY: 5) : ImageFilter.blur(sigmaX: 0, sigmaY: 0), child: Column( children: [ // 语言设置 Obx( () => _buildSimpleNavigationSetting( title: 'languageSetting'.tr, // 语言设置 subtitle: controller.language.value.name.tr, // 当前语言 icon: Icons.language, iconBgColor: isDarkMode ? Colors.indigo[900]!.withOpacity(0.3) : Colors.indigo[100]!, iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () { _showLanguageSelectionDialog(isDarkMode); }, isDarkMode: isDarkMode, ), ), Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // 主题设置 _buildToggleSetting( title: 'darkMode'.tr, // 暗黑模式 subtitle: 'darkModeInfo'.tr, // 切换应用的明暗主题 icon: isDarkMode ? Icons.dark_mode : Icons.light_mode, iconBgColor: isDarkMode ? Colors.indigo[900]!.withOpacity(0.3) : Colors.amber[100]!, iconColor: isDarkMode ? Colors.indigo[300]! : Colors.amber[600]!, value: isDarkMode, onChanged: (value) { controller.toggleTheme(); }, isDarkMode: isDarkMode, ), Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // 用户反馈 _buildSimpleNavigationSetting( title: 'feedback'.tr, // 用户反馈 subtitle: 'feedbackInfo'.tr, // 提供反馈或建议 icon: Icons.feedback_outlined, iconBgColor: isDarkMode ? Colors.orange[900]!.withOpacity(0.3) : Colors.orange[100]!, iconColor: isDarkMode ? Colors.orange[300]! : Colors.orange[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () { // 打开反馈页面 Get.toNamed(Routes.feedback); }, isDarkMode: isDarkMode, ), // if (Platform.isAndroid) ...[ // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // // 隐私设置 // _buildSimpleNavigationSetting( // title: 'privacySettings'.tr, // 隐私设置 // subtitle: 'privacySettingsInfo'.tr, // 管理数据收集和权限 // icon: Icons.shield_outlined, // iconBgColor: isDarkMode // ? Colors.purple[900]!.withOpacity(0.3) // : Colors.purple[100]!, // iconColor: // isDarkMode ? Colors.purple[300]! : Colors.purple[600]!, // titleColor: isDarkMode ? Colors.white : null, // subtitleColor: isDarkMode ? Colors.white70 : null, // onTap: () { // AppSettings.openAppSettings(); // }, // isDarkMode: isDarkMode, // ), // ], Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // 配对设备管理 _buildSimpleNavigationSetting( title: 'deviceManagement'.tr, // 设备管理 subtitle: 'manageConnectedDevices'.tr, // 管理已绑定的蓝牙设备 icon: Icons.device_hub, iconBgColor: isDarkMode ? Colors.red[900]!.withOpacity(0.3) : Colors.red[100]!, iconColor: isDarkMode ? Colors.red[300]! : Colors.red[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () => Get.toNamed(Routes.devices), isDarkMode: isDarkMode, ), Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // // 杰理测试 // _buildSimpleNavigationSetting( // title: '杰理蓝牙测试', // subtitle: '测试杰理蓝牙设备扫描、连接和功能', // icon: Icons.bluetooth, // iconBgColor: isDarkMode // ? Colors.blue[900]!.withOpacity(0.3) // : Colors.blue[100]!, // iconColor: // isDarkMode ? Colors.blue[300]! : Colors.blue[600]!, // titleColor: isDarkMode ? Colors.white : null, // subtitleColor: isDarkMode ? Colors.white70 : null, // onTap: () { // Get.toNamed(Routes.jieliTest); // }, // isDarkMode: isDarkMode, // ), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // 面对面翻译测试 // _buildSimpleNavigationSetting( // title: '面对面翻译测试', // subtitle: '测试面对面翻译', // icon: Icons.bluetooth_searching, // iconBgColor: isDarkMode // ? Colors.green[900]!.withOpacity(0.3) // : Colors.green[100]!, // iconColor: // isDarkMode ? Colors.green[300]! : Colors.green[600]!, // titleColor: isDarkMode ? Colors.white : null, // subtitleColor: isDarkMode ? Colors.white70 : null, // onTap: () { // Get.toNamed(Routes.ftftranslation); // }, // isDarkMode: isDarkMode, // ), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // //BLE测试 // 支付测试 // _buildSimpleNavigationSetting( // title: '支付测试', // subtitle: '测试微信支付功能', // icon: Icons.payment, // iconBgColor: isDarkMode // ? Colors.green[900]!.withOpacity(0.3) // : Colors.green[100]!, // iconColor: // isDarkMode ? Colors.green[300]! : Colors.green[600]!, // titleColor: isDarkMode ? Colors.white : null, // subtitleColor: isDarkMode ? Colors.white70 : null, // onTap: () { // Get.toNamed(Routes.payment); // }, // isDarkMode: isDarkMode, // ), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), Obx(() => controller.showDebugInfo.value ? _buildSimpleNavigationSetting( title: 'opus解码测试', subtitle: '测试opus解码', icon: Icons.bluetooth_searching, iconBgColor: isDarkMode ? Colors.green[900]!.withOpacity(0.3) : Colors.green[100]!, iconColor: isDarkMode ? Colors.green[300]! : Colors.green[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () { Get.toNamed(Routes.opusTest); }, isDarkMode: isDarkMode, ) : const SizedBox.shrink()), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // BLE测试 // _buildSimpleNavigationSetting( // title: 'BLE蓝牙测试', // subtitle: '测试BLE蓝牙设备扫描、连接和功能', // icon: Icons.bluetooth_searching, // iconBgColor: isDarkMode // ? Colors.green[900]!.withOpacity(0.3) // : Colors.green[100]!, // iconColor: // isDarkMode ? Colors.green[300]! : Colors.green[600]!, // titleColor: isDarkMode ? Colors.white : null, // subtitleColor: isDarkMode ? Colors.white70 : null, // onTap: () { // Get.toNamed(Routes.bleTest); // }, // isDarkMode: isDarkMode, // ), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // // 火山语音测试 // _buildSimpleNavigationSetting( // title: '语音测试', // subtitle: '测试语音识别和合成功能,支持多种服务实现', // icon: Icons.record_voice_over, // iconBgColor: isDarkMode // ? Colors.orange[900]!.withOpacity(0.3) // : Colors.orange[100]!, // iconColor: // isDarkMode ? Colors.orange[300]! : Colors.orange[600]!, // onTap: () => Get.toNamed(Routes.speechTest), // isDarkMode: isDarkMode, // ), // Divider( // height: 1, // color: isDarkMode // ? Colors.white.withOpacity(0.1) // : Colors.grey[200]), // 测试ble耳机固件版本升级 _buildSimpleNavigationSetting( title: 'firmwareUpgrade'.tr, // 固件升级 subtitle: 'bleHeadsetFirmwareUpgrade'.tr, // BLE耳机固件版本升级 icon: Icons.system_update_alt, iconBgColor: isDarkMode ? Colors.orange[900]!.withOpacity(0.3) : Colors.orange[100]!, iconColor: isDarkMode ? Colors.orange[300]! : Colors.orange[600]!, onTap: () => Get.toNamed(Routes.OTA_UPGRADE), isDarkMode: isDarkMode, ), // if (Platform.isAndroid) ...[ Divider( height: 1, color: isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[200]), // 权限管理设置项 _buildSimpleNavigationSetting( title: 'permissionManagement'.tr, // 权限管理 subtitle: 'permissionManagementInfo'.tr, // 管理应用权限设置 icon: Icons.security, iconBgColor: isDarkMode ? Colors.orange[900]!.withOpacity(0.3) : Colors.orange[100]!, iconColor: isDarkMode ? Colors.orange[300]! : Colors.orange[600]!, titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () { Get.toNamed(Routes.permissions); }, isDarkMode: isDarkMode, ), // ] ], ), ), ), ), ], ); } // 关于应用部分 Widget _buildAboutSection(bool isDarkMode) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(left: 4.w, bottom: 8.h), child: Text( 'aboutApplication'.tr, // 关于应用 style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.blue[400] : Colors.blue[600], letterSpacing: 1, ), ), ), Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.white, borderRadius: BorderRadius.circular(16.r), boxShadow: [ BoxShadow( color: isDarkMode ? Colors.black.withOpacity(0.2) : Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), clipBehavior: Clip.antiAlias, child: BackdropFilter( filter: isDarkMode ? ImageFilter.blur(sigmaX: 5, sigmaY: 5) : ImageFilter.blur(sigmaX: 0, sigmaY: 0), child: Row( children: [ // 左侧应用信息区域 - 使用固定宽度 Row( children: [ GestureDetector( onTap: controller.handleSecretTap, // 点击事件 child: Container( width: 40.w, height: 40.w, decoration: BoxDecoration( gradient: LinearGradient( colors: [ const Color(0xFF2196F3) .withOpacity(isDarkMode ? 0.7 : 1.0), const Color(0xFF9C27B0) .withOpacity(isDarkMode ? 0.7 : 1.0) ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(12.r), ), child: Icon( Icons.headphones, size: 24.w, color: Colors.white, ), ), ), SizedBox(width: 12.w), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Voitrans', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 2.h), Obx(() => Text( // 如果版本信息为空,显示加载中 controller.appVersion.value.isEmpty ? '${'versions'.tr} ${'loading'.tr}' // 版本 加载中 : '${'versions'.tr} ${controller.appVersion.value} (Build ${controller.buildNumber.value})', // 版本号 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), )), ], ), ], ), // 间距 SizedBox(width: 16.w), // 右侧检查更新按钮 - 使用Expanded确保充分利用剩余空间 Expanded( child: InkWell( onTap: () { // 调用检查更新方法 controller.checkForUpdate(); }, child: Container( constraints: BoxConstraints( minHeight: 36.h, // 设置最小高度而不是宽度约束 ), padding: EdgeInsets.symmetric( horizontal: 12.w, vertical: 8.h, ), decoration: BoxDecoration( color: isDarkMode ? Colors.blue[900]!.withOpacity(0.3) : Colors.blue[100], borderRadius: BorderRadius.circular(16.r), ), child: Center( child: FittedBox( fit: BoxFit.scaleDown, // 如果文本过长,自动缩小字体 child: Text( 'checkUpdates'.tr, // 检查更新 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.blue[300] : Colors.blue[600], height: 1.2, // 稍微减少行高,适应FittedBox ), textAlign: TextAlign.center, maxLines: 2, // 最多显示2行,配合FittedBox使用 ), ), ), ), ), ), ], ), ), ), SizedBox(height: 16.h), Center( child: Column( children: [ Text( '© 2025 Voitrans Technologies', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.grey[400] : Colors.grey[500], ), ), SizedBox(height: 4.h), Text( 'homeSlogan'.tr, // 连接世界,超越声音 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.grey[400] : Colors.grey[500], ), ), SizedBox(height: 4.h), if (Get.locale?.languageCode == 'zh' && Get.locale?.countryCode == 'CN') InkWell( onTap: () => Get.to( () => const WebViewPage( url: 'https://beian.miit.gov.cn', title: 'ICP备案信息', ), ), child: Text( '粤ICP备2025402357号-2A', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.grey[400] : Colors.grey[500], ), ), ), ], ), ), // 隐藏的调试信息 Obx(() => controller.showDebugInfo.value ? Container( margin: EdgeInsets.only(top: 12.h), padding: EdgeInsets.all(12.w), decoration: BoxDecoration( color: isDarkMode ? Colors.grey[800] : Colors.grey[100], borderRadius: BorderRadius.circular(8.r), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '版本服务调试信息', style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.bold, color: isDarkMode ? Colors.white : Colors.black, ), ), SizedBox(height: 8.h), Text( controller.getSomeAppData(), style: TextStyle( fontSize: 10.sp, fontFamily: 'monospace', color: isDarkMode ? Colors.white70 : Colors.black87, ), ), ], ), ) : const SizedBox.shrink()), ], ); } // 开关类设置项 Widget _buildToggleSetting({ required String title, String? subtitle, required IconData icon, required Color iconBgColor, required Color iconColor, required bool value, required Function(bool) onChanged, required bool isDarkMode, }) { return Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: iconBgColor, borderRadius: BorderRadius.circular(16.r), ), child: Icon( icon, size: 16.w, color: iconColor, ), ), SizedBox(width: 12.w), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, height: 1.2, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), if (subtitle != null) SizedBox(height: 2.h), if (subtitle != null) Text( subtitle, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, height: 1.3, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), ], ), ), ], ), ), Switch( value: value, onChanged: onChanged, activeColor: Colors.blue[600], ), ], ), ); } // 带导航的设置项 Widget _buildNavigationSetting({ required String title, String? subtitle, required IconData icon, required Color iconBgColor, required Color iconColor, required String value, TextStyle? valueStyle, required VoidCallback onTap, required bool isDarkMode, }) { return InkWell( onTap: onTap, child: Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: iconBgColor, borderRadius: BorderRadius.circular(16.r), ), child: Icon( icon, size: 16.w, color: iconColor, ), ), SizedBox(width: 12.w), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, height: 1.2, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), if (subtitle != null) SizedBox(height: 2.h), if (subtitle != null) Text( subtitle, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, height: 1.3, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), ], ), ), ], ), ), Row( mainAxisSize: MainAxisSize.min, children: [ Flexible( child: Text( value, style: valueStyle ?? TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white : Colors.black87, ), overflow: TextOverflow.ellipsis, ), ), SizedBox(width: 8.w), Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100], borderRadius: BorderRadius.circular(16.r), ), child: Icon( Icons.chevron_right, size: 16.w, color: isDarkMode ? Colors.white70 : Colors.grey[500], ), ), ], ), ], ), ), ); } // 简单导航设置项 Widget _buildSimpleNavigationSetting({ required String title, String? subtitle, required IconData icon, required Color iconBgColor, required Color iconColor, Color? titleColor, Color? subtitleColor, required VoidCallback onTap, required bool isDarkMode, }) { return InkWell( onTap: onTap, child: Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: iconBgColor, borderRadius: BorderRadius.circular(16.r), ), child: Icon( icon, size: 16.w, color: iconColor, ), ), SizedBox(width: 12.w), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: titleColor ?? (isDarkMode ? Colors.white : Colors.black87), height: 1.2, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), if (subtitle != null) SizedBox(height: 2.h), if (subtitle != null) Text( subtitle, style: TextStyle( fontSize: 12.sp, color: subtitleColor ?? (isDarkMode ? Colors.white70 : Colors.black54), height: 1.3, // 设置行高,提升多行文本可读性 ), softWrap: true, // 启用软换行 overflow: TextOverflow.visible, // 确保文本完全显示 ), ], ), ), ], ), ), Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100], borderRadius: BorderRadius.circular(16.r), ), child: Icon( Icons.chevron_right, size: 16.w, color: isDarkMode ? Colors.white70 : Colors.grey[500], ), ), ], ), ), ); } // 语音服务设置项 Widget _buildSpeechServiceSetting(bool isDarkMode) { return InkWell( onTap: () { _showSpeechServiceSelectionDialog(isDarkMode); }, child: Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Container( //语音服务图标 width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.teal[900]!.withOpacity(0.3) : Colors.teal[100]!, borderRadius: BorderRadius.circular(16.r), ), child: Icon( Icons.record_voice_over, size: 16.w, color: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, ), ), SizedBox(width: 12.w), Flexible( //语音服务标题和副标题 child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'voiceService'.tr, // 语音服务 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 2.h), Text( 'voiceServiceInfo'.tr, // 选择语音识别和合成服务 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), overflow: TextOverflow.ellipsis, ), ], ), ), ], ), ), Row( mainAxisSize: MainAxisSize.min, children: [ Obx(() { final serviceType = controller.speechServiceType.value; final serviceName = controller.availableSpeechServices .firstWhere((service) => service['type'] == serviceType, orElse: () => {'name': 'unknown'})['name']; return Container( constraints: BoxConstraints(maxWidth: 120.w), // 限制最大宽度 child: Text( '$serviceName'.tr, // 语音服务名称 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[600], ), overflow: TextOverflow.ellipsis, ), ); }), SizedBox(width: 8.w), Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100], borderRadius: BorderRadius.circular(16.r), ), child: Icon( Icons.chevron_right, size: 16.w, color: isDarkMode ? Colors.white70 : Colors.grey[500], ), ), ], ), ], ), ), ); } // 显示语音服务选择对话框 void _showSpeechServiceSelectionDialog(bool isDarkMode) { Get.dialog( Dialog( backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16.r), ), child: Padding( padding: EdgeInsets.all(16.w), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'selectVoiceService'.tr, // 选择语音服务 style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 16.h), ...controller.availableSpeechServices.map((service) { return Obx(() { final isSelected = controller.speechServiceType.value == service['type']; return GestureDetector( onTap: () { controller.setSpeechServiceType(service['type']); Get.back(); }, child: Container( margin: EdgeInsets.only(bottom: 12.h), padding: EdgeInsets.all(12.w), decoration: BoxDecoration( color: isSelected ? (isDarkMode ? Colors.teal[900]!.withOpacity(0.3) : Colors.teal[50]!) : (isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100]!), borderRadius: BorderRadius.circular(12.r), border: Border.all( color: isSelected ? (isDarkMode ? Colors.teal[300]! : Colors.teal[600]!) : Colors.transparent, width: 1, ), ), child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '${service['name']}'.tr, // 服务名称 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), overflow: TextOverflow.ellipsis, ), SizedBox(height: 4.h), Text( '${service['description']}'.tr, // 服务描述 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), overflow: TextOverflow.ellipsis, maxLines: 2, ), ], ), ), SizedBox(width: 12.w), Container( width: 24.w, height: 24.w, decoration: BoxDecoration( color: isSelected ? (isDarkMode ? Colors.teal[300] : Colors.teal[600]) : (isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[300]), shape: BoxShape.circle, ), child: isSelected ? Icon( Icons.check, size: 16.w, color: Colors.white, ) : null, ), ], ), ), ); }); }).toList(), SizedBox(height: 16.h), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () => Get.back(), child: Text( 'cancel'.tr, // 取消 style: TextStyle( color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ), ], ), ], ), ), ), ); } // 显示语言选择对话框 void _showLanguageSelectionDialog(bool isDarkMode) { Get.dialog( Dialog( backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16.r), ), child: Padding( padding: EdgeInsets.all(12.w), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'selectLanguage'.tr, // 选择语言 style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 16.h), Container( constraints: BoxConstraints(maxHeight: 0.5.sh), child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: controller.languageList.map((language) { return Obx(() { final isSelected = controller.language.value.value == language.value; return GestureDetector( onTap: () { controller.setLanguage(language); Get.back(); }, child: Container( margin: EdgeInsets.only(bottom: 10.h), padding: EdgeInsets.all(10.w), decoration: BoxDecoration( color: isSelected ? (isDarkMode ? Colors.teal[900]!.withOpacity(0.3) : Colors.teal[50]!) : (isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100]!), borderRadius: BorderRadius.circular(12.r), border: Border.all( color: isSelected ? (isDarkMode ? Colors.teal[300]! : Colors.teal[600]!) : Colors.transparent, width: 1, ), ), child: Row( children: [ Expanded( child: Text( language.name.tr, // 语言名称 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), overflow: TextOverflow.ellipsis, ), ), Text( language.alias, // 语言别名(原始名称,不加.tr) style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), SizedBox(width: 10.w), Container( width: 24.w, height: 24.w, decoration: BoxDecoration( color: isSelected ? (isDarkMode ? Colors.teal[300] : Colors.teal[600]) : (isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[300]), shape: BoxShape.circle, ), child: isSelected ? Icon( Icons.check, size: 16.w, color: Colors.white, ) : null, ), ], ), ), ); }); }).toList(), ), ), ), SizedBox(height: 16.h), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () => Get.back(), child: Text( 'cancel'.tr, // 取消 style: TextStyle( color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ), ], ), ], ), ), ), ); } // 添加权限管理设置项 Widget _buildSettingItem({ required IconData icon, required Color iconColor, required String title, required bool isDarkMode, required VoidCallback onTap, }) { return InkWell( onTap: onTap, child: Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100], borderRadius: BorderRadius.circular(16.r), ), child: Icon( icon, size: 16.w, color: iconColor, ), ), SizedBox(width: 12.w), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), overflow: TextOverflow.ellipsis, ), ], ), ), ], ), ), Container( width: 32.w, height: 32.w, decoration: BoxDecoration( color: isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[100], borderRadius: BorderRadius.circular(16.r), ), child: Icon( Icons.chevron_right, size: 16.w, color: isDarkMode ? Colors.white70 : Colors.grey[500], ), ), ], ), ), ); } }