import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:image_picker/image_picker.dart'; import 'package:logger/logger.dart'; import '../../../data/models/user_model.dart'; import '../../settings/controllers/settings_controller.dart'; import 'dart:io'; import 'dart:convert'; import 'package:flutter_image_compress/flutter_image_compress.dart'; class ProfileController extends GetxController { static ProfileController get to => Get.find(); // final _userName = ''.obs; // final _email = ''.obs; // final _avatar = ''.obs; // final _isEditing = false.obs; // final _storage = GetStorage(); //用户信息 static const String userKey = 'user_info'; final _storage = GetStorage(); final ImagePicker _picker = ImagePicker(); final Rx userInfo = UserModel.defaultUser().obs; // 使用响应式变量 final currentLanguage = 'zh'.obs; // String get userName => _userName.value; // String get email => _email.value; // String get avatar => _avatar.value; // bool get isEditing => _isEditing.value; @override void onInit() { super.onInit(); loadUserInfo(); loadLanguagePreference(); } // void loadUserData() { // try { // _userName.value = _storage.read('userName') ?? 'User Name'; // _email.value = _storage.read('userEmail') ?? 'user@example.com'; // _avatar.value = _storage.read('userAvatar') ?? ''; // } catch (e) { // Get.snackbar('Error', 'Failed to load user data'); // } // } // 加载用户语言偏好设置 void loadLanguagePreference() { try { final String? languageCode = _storage.read('languageCode'); final String? countryCode = _storage.read('countryCode'); if (languageCode != null && countryCode != null) { Get.updateLocale(Locale(languageCode, countryCode)); currentLanguage.value = languageCode; } } catch (e) { print('Failed to load language preference: $e'); } } // 保存用户语言偏好设置 Future saveLanguagePreference(Locale locale) async { try { await _storage.write('languageCode', locale.languageCode); await _storage.write('countryCode', locale.countryCode); } catch (e) { print('Failed to save language preference: $e'); } } // 切换应用语言 void changeLanguage(String languageCode, String countryCode) { // 使用Future.delayed来避免在构建过程中更新UI Future.delayed(Duration.zero, () async { final locale = Locale(languageCode, countryCode); await saveLanguagePreference(locale); Get.updateLocale(locale); currentLanguage.value = languageCode; }); } // Future updateUserData({ // String? userName, // String? email, // String? avatar, // }) async { // try { // if (userName != null) { // await _storage.write('userName', userName); // _userName.value = userName; // } // if (email != null) { // await _storage.write('userEmail', email); // _email.value = email; // } // if (avatar != null) { // await _storage.write('userAvatar', avatar); // _avatar.value = avatar; // } // Get.snackbar('Success', 'Profile updated successfully'); // } catch (e) { // Get.snackbar('Error', 'Failed to update profile'); // } // } // void toggleEditing() { // _isEditing.value = !_isEditing.value; // } // 更新用户信息到后端 Future _syncWithBackend() async { try { // 准备数据 Map data = { "image": "", // 默认空字符串 "name": userInfo.value.name, "language": currentLanguage.value, }; // 如果有头像,转换为base64 if (userInfo.value.avatar.isNotEmpty) { File imageFile = File(userInfo.value.avatar); List imageBytes = await imageFile.readAsBytes(); String base64Image = base64Encode(imageBytes); data["image"] = base64Image; } // 调用API final response = await GetConnect().post( 'https://www.deapsound.com:443/api/home/user_setting', headers: { 'accept': 'application/json', 'Content-Type': 'application/json', }, data, ); if (response.statusCode != 200) { throw '更新失败:${response.body}'; } } catch (e) { Logger().e('同步到后端失败: $e'); Get.snackbar('错误','同步到服务器失败,请重试'); throw e; } } void loadUserInfo() { final userJson = _storage.read(userKey); if (userJson != null) { userInfo.value = UserModel.fromJson(userJson); } } Future saveUserInfo() async { await _storage.write(userKey, userInfo.value.toJson()); } Future updateUserAvatar() async { final XFile? image = await _picker.pickImage( source: ImageSource.gallery, maxWidth: 800, maxHeight: 800, imageQuality: 85, ); if (image != null) { // 检查文件大小 final file = File(image.path); var fileSize = await file.length(); var quality = 85; // 如果文件大于1MB,进行压缩 while (fileSize > 1024 * 1024 && quality > 30) { final compressedImage = await FlutterImageCompress.compressAndGetFile( file.absolute.path, file.absolute.path, // 覆盖原文件 quality: quality, minWidth: 800, minHeight: 800, ); if (compressedImage == null) { Get.snackbar('错误', '图片压缩失败'); return; } //更新文件大小和质量 fileSize = await compressedImage.length(); quality -= 5; Logger().d('压缩后文件大小:$fileSize'); } userInfo.update((user) { if (user != null) { user.avatar = image.path; } }); await saveUserInfo();//保存到本地 await _syncWithBackend();//同步到后端 // 通知 SettingsController 更新 if (Get.isRegistered()) { Get.find().loadUserInfo(); } } } Future updateUserName(String name) async { if (name.trim().isEmpty) { Logger().e('Invalid name: $name'); return; } try { userInfo.update((user) { if (user != null) { user.name = name.trim(); Logger().d('Name updated to: ${user.name}'); } }); await saveUserInfo();//保存到本地 await _syncWithBackend();//同步到后端 // 同步更新 SettingsController if (Get.isRegistered()) { final settingsController = Get.find(); settingsController.loadUserInfo(); } } catch (e) { Logger().e('Error updating name: $e'); Get.snackbar('错误', 'Failed to update user name'); } } }