import 'package:firebase_auth/firebase_auth.dart' as firebase; import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; import 'package:get_storage/get_storage.dart'; import '../../../core/themes/theme_service.dart'; import '../../../data/services/speech_factory.dart'; import '../models/language_model.dart'; import 'package:logger/logger.dart'; import '../../../data/models/user_Info.dart'; import '../../../modules/login/controllers/googleLogin.dart'; import '../../../modules/login/controllers/facebookLogin.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; import '../../../routes/app_routes.dart'; class SettingsController extends GetxController { // 语言设置 final List languageList = [ LanguageModel( name: 'followingSystem', // 跟随系统.tr alias: 'followingSystem', // 跟随系统.tr value: 'system'), LanguageModel(name: 'chinese', alias: '中文', value: 'zh_CN'), // 中文.tr LanguageModel(name: 'english', alias: 'English', value: 'en_US'), // 英语.tr ]; Rx language = LanguageModel().obs; final GetStorage _storage = GetStorage(); // 主题服务 final ThemeService _themeService = ThemeService(); // 是否是暗黑模式 final RxBool isDarkMode = false.obs; // 翻译语言对 final RxString sourceLanguage = '中文'.obs; final RxString targetLanguage = '英文'.obs; final List availableLanguages = [ '中文', '英文', '日文', '韩文', '法文', '德文', '西班牙文', '俄文' ]; // 语音服务类型 final Rx speechServiceType = SpeechServiceType.azure.obs; final List> availableSpeechServices = [ { 'type': SpeechServiceType.azure, 'name': 'azureVoiceService', // Azure 语音服务.tr 'description': 'azureVoiceServiceInfo' // 微软云端语音服务,支持高质量语音合成和识别.tr }, { 'type': SpeechServiceType.flutter, 'name': 'flutterVoiceService', // Flutter 本地语音服务.tr 'description': 'flutterVoiceServiceInfo' // 设备本地语音服务,无需联网即可使用.tr }, ]; RxString timbreName = 'defaultTimbre'.obs; //用户信息 static const String userKey = 'user_info'; //final _storage=GetStorage(); //final ImagePicker _picker = ImagePicker(); final Rx userInfo = User.instance.obs; //使用单例实例 @override void onInit() { super.onInit(); // 获取系统语言 _getLanguage(); _getTimbre(); // 从存储中加载上次保存的主题设置 final savedDarkMode = _themeService.isSavedDarkMode(); // 设置当前主题状态 isDarkMode.value = savedDarkMode; // 获取当前语音服务类型 _loadCurrentSpeechServiceType(); //获取用户信息 loadUserInfo(); } void loadUserInfo() { final userJson = _storage.read(userKey); Logger().d('加载用户信息: $userJson'); if (userJson != null) { userInfo.value = User.instance; Logger().d('用户信息已加载: ${userInfo.value.toJson()}'); if (userInfo.value.avatar.isNotEmpty) { Logger().d('开始下载头像'); _downloadAndSaveAvatar(userInfo.value.avatar); } else { Logger().d('用户没有头像'); } } else { Logger().d('没有找到用户信息'); } } Future saveUserInfo() async { await _storage.write(userKey, userInfo.value.toJson()); } // 下载并保存远程头像 Future _downloadAndSaveAvatar(String url) async { try { Logger().d('开始下载头像: $url'); final dio = Dio(BaseOptions( headers: { 'accept': '*/*', 'Authorization': _storage.read("logintoken"), }, )); final response = await dio.get( url, options: Options(responseType: ResponseType.bytes), ); Logger().d('下载状态: ${response.statusCode}'); if (response.statusCode == 200) { // 保存到应用文档目录 final appDir = await getApplicationDocumentsDirectory(); final fileName = 'avatar_${DateTime.now().millisecondsSinceEpoch}.jpg'; final localPath = '${appDir.path}/$fileName'; // 写入文件 final file = File(localPath); await file.writeAsBytes(response.data); // 更新本地头像路径 //localAvatar.value = localPath; await _storage.write('local_avatar', localPath); Logger().d('头像已下载到本地: $localPath'); //Get.snackbar('头像', '头像已下载到本地'); } } catch (e) { Logger().e('下载头像失败: $e'); } } // Future updateUserAvatar() async { // final XFile? image = await _picker.pickImage( // source: ImageSource.gallery, // maxWidth: 800, // maxHeight: 800, // imageQuality: 85, // ); // if (image != null) { // userInfo.update((user) { // if (user != null) { // user.avatar = image.path; // } // }); // await saveUserInfo(); // } // } Future updateUserName(String name) async { if (name.trim().isNotEmpty) { userInfo.update((user) { if (user != null) { user.name = name.trim(); } }); await saveUserInfo(); } } // Future updateDeviceName(String deviceName) async { // userInfo.update((user) { // if (user != null) { // user.deviceName = deviceName; // } // }); // await saveUserInfo(); // } // } void _getLanguage() { String? languageValue = _storage.read('language'); LanguageModel data = languageList.firstWhere( (element) => element.value == languageValue, orElse: () => languageList[0], ); language.value = data; } // 获取音色 void _getTimbre() { List? timbreList = _storage.read('timbreList'); String? timbre = _storage.read('timbre'); if (timbreList != null && timbre != null) { Map data = timbreList.firstWhere( (element) => element['type'] == timbre, orElse: () => {}, ); if (data.isNotEmpty) { timbreName.value = data['name']; } } } void setLanguage(LanguageModel data) { if (data.value != 'system') { List languageList = data.value.split('_'); Get.updateLocale(Locale(languageList[0], languageList[1])); } else { Get.updateLocale(Get.deviceLocale!); } language.value = data; _storage.write('language', data.value); Get.back(); } // 加载当前语音服务类型 void _loadCurrentSpeechServiceType() { try { final factory = Get.find(); speechServiceType.value = factory.currentServiceType; } catch (e) { // 如果找不到SpeechFactory实例,使用默认值 } } // 切换主题 Future toggleTheme() async { // 切换暗黑模式状态 isDarkMode.value = !isDarkMode.value; // 更新全局主题 Get.changeThemeMode(isDarkMode.value ? ThemeMode.dark : ThemeMode.light); // 保存用户选择的主题设置 - 确保立即写入存储 await _themeService.saveThemeMode(isDarkMode.value); } // 设置语音服务类型 void setSpeechServiceType(SpeechServiceType type) { try { final factory = Get.find(); factory.setServiceType(type); speechServiceType.value = type; } catch (e) { // 处理错误 } } void setSourceLanguage(String language) { sourceLanguage.value = language; } void setTargetLanguage(String language) { targetLanguage.value = language; } void swapLanguages() { final temp = sourceLanguage.value; sourceLanguage.value = targetLanguage.value; targetLanguage.value = temp; } Future signOut() async { try { //显示加载提示 // Get.dialog( // const Center(child: CircularProgressIndicator()), // barrierDismissible: false, // ); // 清理所有存储 await _storage.erase(); // 或者逐个清理关键存储项 await _storage.write("logintoken", null); await _storage.write("user_info", null); await _storage.write("local_avatar", null); print('清理存储成功'); // 第三方登录退出 try { final google = Google(); final facebook = Facebook(); await Future.wait([ google.signOutGoogle(), facebook.signOutFacebook(), ]); } catch (e) { print('第三方登录退出错误: $e'); // 继续执行,不中断退出流程 } // 关闭加载提示 //Get.back(); // 确保导航到登录页面 if (Get.currentRoute != Routes.login) { await Get.offAllNamed(Routes.login); } Get.snackbar('成功', '已退出登录'); print('退出登录成功'); } catch (e) { //Get.back(); // 关闭加载提示 Get.snackbar('错误', '退出登录失败,请重试'); print('退出登录错误: $e'); } } }