You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.6 KiB
200 lines
5.6 KiB
import 'package:get/get.dart';
|
|
import 'package:get_storage/get_storage.dart';
|
|
import 'package:flutter/material.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 '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<UserModel> 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<void> 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<void> 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;
|
|
// }
|
|
|
|
void loadUserInfo() {
|
|
final userJson = _storage.read(userKey);
|
|
if (userJson != null) {
|
|
userInfo.value = UserModel.fromJson(userJson);
|
|
}
|
|
}
|
|
|
|
Future<void> saveUserInfo() async {
|
|
await _storage.write(userKey, userInfo.value.toJson());
|
|
}
|
|
|
|
Future<void> 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();
|
|
|
|
// 通知 SettingsController 更新
|
|
if (Get.isRegistered<SettingsController>()) {
|
|
Get.find<SettingsController>().loadUserInfo();
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> 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();
|
|
|
|
// 同步更新 SettingsController
|
|
if (Get.isRegistered<SettingsController>()) {
|
|
final settingsController = Get.find<SettingsController>();
|
|
settingsController.loadUserInfo();
|
|
}
|
|
} catch (e) {
|
|
Logger().e('Error updating name: $e');
|
|
Get.snackbar('Error', 'Failed to update user name');
|
|
}
|
|
}
|
|
}
|
|
|