|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import 'package:get/get.dart'; |
|
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
import 'package:http/http.dart'; |
|
|
|
//import 'package:http/http.dart'; |
|
|
|
import 'package:image_picker/image_picker.dart'; |
|
|
|
import 'package:logger/logger.dart'; |
|
|
|
import '../../../data/models/user_Info.dart'; |
|
|
|
@ -9,6 +9,9 @@ import '../../settings/controllers/settings_controller.dart'; |
|
|
|
import 'dart:io'; |
|
|
|
import 'dart:convert'; |
|
|
|
import 'package:flutter_image_compress/flutter_image_compress.dart'; |
|
|
|
import 'package:path_provider/path_provider.dart'; |
|
|
|
import '../../../data/services/network/api.dart'; |
|
|
|
import 'package:dio/dio.dart'; |
|
|
|
|
|
|
|
class ProfileController extends GetxController { |
|
|
|
static ProfileController get to => Get.find(); |
|
|
|
@ -19,11 +22,11 @@ class ProfileController extends GetxController { |
|
|
|
// final _isEditing = false.obs; |
|
|
|
// final _storage = GetStorage(); |
|
|
|
//用户信息 |
|
|
|
static const String userKey = 'user_info'; |
|
|
|
final _storage = GetStorage(); |
|
|
|
final ImagePicker _picker = ImagePicker(); |
|
|
|
final Rx<User> userInfo = User.instance.obs; |
|
|
|
//final RxString localAvatar = ''.obs; |
|
|
|
static const String userKey = 'user_info'; //用户信息存储键 |
|
|
|
final _storage = GetStorage(); //本地存储 |
|
|
|
final ImagePicker _picker = ImagePicker(); //图片选择器 |
|
|
|
final Rx<User> userInfo = User.instance.obs; // 响应式用户信息对象,使用单例模式确保全局唯一性 |
|
|
|
final RxString localAvatar = ''.obs; // 本地头像路径,便于响应式更新UI |
|
|
|
|
|
|
|
// 使用响应式变量 |
|
|
|
final currentLanguage = 'zh'.obs; |
|
|
|
@ -120,30 +123,55 @@ class ProfileController extends GetxController { |
|
|
|
// 准备数据 |
|
|
|
Map<String, dynamic> data = { |
|
|
|
"image": "", // 默认空字符串 |
|
|
|
"name": userInfo.value.name, |
|
|
|
"language": currentLanguage.value, |
|
|
|
"name": userInfo.value.name, |
|
|
|
}; |
|
|
|
|
|
|
|
// 如果有头像,转换为base64 |
|
|
|
if (userInfo.value.avatar.isNotEmpty) { |
|
|
|
File imageFile = File(userInfo.value.avatar); |
|
|
|
List<int> imageBytes = await imageFile.readAsBytes(); |
|
|
|
String base64Image = base64Encode(imageBytes); |
|
|
|
data["image"] = base64Image; |
|
|
|
} |
|
|
|
// // 如果有头像,转换为base64 |
|
|
|
// if (localAvatar.value.isNotEmpty) { |
|
|
|
// try{ |
|
|
|
// File imageFile = File(localAvatar.value); |
|
|
|
// if(await imageFile.exists()){ |
|
|
|
// List<int> imageBytes = await imageFile.readAsBytes(); |
|
|
|
// String base64Image = base64Encode(imageBytes); |
|
|
|
// data["image"] = base64Image; |
|
|
|
// }else{ |
|
|
|
// Logger().e('头像文件不存在'); |
|
|
|
// } |
|
|
|
// }catch(e){ |
|
|
|
// Logger().e('读取头像文件失败: $e'); |
|
|
|
// } |
|
|
|
|
|
|
|
// 调用API |
|
|
|
final response = await GetConnect().post( |
|
|
|
'https://www.deapsound.com:443/api/home/user_setting', |
|
|
|
// } |
|
|
|
|
|
|
|
final dio = Dio(BaseOptions( |
|
|
|
baseUrl: 'https://www.deapsound.com:443', |
|
|
|
headers: { |
|
|
|
'accept': 'application/json', |
|
|
|
'Authorization': _storage.read<String>("logintoken"), |
|
|
|
'Content-Type': 'application/json', |
|
|
|
}, |
|
|
|
data, |
|
|
|
)); |
|
|
|
|
|
|
|
// 调用API前打印token |
|
|
|
Logger().d('当前用户token: ${userInfo.value.token}'); |
|
|
|
Logger().d('请求数据: ${{"user": data}}'); |
|
|
|
final response = await dio.post( |
|
|
|
'/api/home/user_setting', |
|
|
|
data: data, |
|
|
|
); |
|
|
|
// 调用API |
|
|
|
//final response = await Api.updateUserSetting(data); |
|
|
|
|
|
|
|
if (response.statusCode != 200) { |
|
|
|
throw '更新失败:${response.body}'; |
|
|
|
if (response.statusCode == 200) { |
|
|
|
if (response.data['code'] == 0) { |
|
|
|
Logger().d('更新成功: ${response.data}'); |
|
|
|
Get.snackbar('成功', '同步到服务器成功'); |
|
|
|
} else { |
|
|
|
throw '更新失败:${response.data['msg'] ?? '未知错误'}'; |
|
|
|
} |
|
|
|
} else { |
|
|
|
throw '服务器响应错误: ${response.statusCode}'; |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
Logger().e('同步到后端失败: $e'); |
|
|
|
@ -156,6 +184,37 @@ class ProfileController extends GetxController { |
|
|
|
final userJson = _storage.read(userKey); |
|
|
|
if (userJson != null) { |
|
|
|
userInfo.value = User.instance; |
|
|
|
// 如果有远程头像地址,下载并保存到本地 |
|
|
|
if (userInfo.value.avatar.isNotEmpty) { |
|
|
|
_downloadAndSaveAvatar(userInfo.value.avatar); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 下载并保存远程头像 |
|
|
|
Future<void> _downloadAndSaveAvatar(String url) async { |
|
|
|
try { |
|
|
|
final response = await GetConnect().get(url); |
|
|
|
if (response.status.isOk && response.body != null) { |
|
|
|
// 保存到应用文档目录 |
|
|
|
final appDir = await getApplicationDocumentsDirectory(); |
|
|
|
final fileName = 'avatar_${DateTime.now().millisecondsSinceEpoch}.jpg'; |
|
|
|
final localPath = '${appDir.path}/$fileName'; |
|
|
|
|
|
|
|
// 写入文件 |
|
|
|
final file = File(localPath); |
|
|
|
final List<int> bytes = response.body.runtimeType == String |
|
|
|
? base64Decode(response.body.toString()) |
|
|
|
: response.body; |
|
|
|
await file.writeAsBytes(bytes); |
|
|
|
|
|
|
|
// 更新本地头像路径 |
|
|
|
localAvatar.value = localPath; |
|
|
|
await _storage.write('local_avatar', localPath); |
|
|
|
Logger().d('头像已下载到本地: $localPath'); |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
Logger().e('下载头像失败: $e'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -163,6 +222,7 @@ class ProfileController extends GetxController { |
|
|
|
await _storage.write(userKey, userInfo.value.toJson()); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新用户头像 |
|
|
|
Future<void> updateUserAvatar() async { |
|
|
|
final XFile? image = await _picker.pickImage( |
|
|
|
source: ImageSource.gallery, |
|
|
|
@ -203,19 +263,24 @@ class ProfileController extends GetxController { |
|
|
|
user.avatar = image.path; |
|
|
|
} |
|
|
|
}); |
|
|
|
await saveUserInfo();//保存到本地 |
|
|
|
|
|
|
|
// 更新本地头像路径 |
|
|
|
localAvatar.value = image.path; |
|
|
|
await _storage.write('local_avatar', image.path); |
|
|
|
// await saveUserInfo(); //保存到本地 |
|
|
|
await _syncWithBackend(); //同步到后端 |
|
|
|
|
|
|
|
// 通知 SettingsController 更新 |
|
|
|
if (Get.isRegistered<SettingsController>()) { |
|
|
|
Get.find<SettingsController>().loadUserInfo(); |
|
|
|
} |
|
|
|
// if (Get.isRegistered<SettingsController>()) { |
|
|
|
// Get.find<SettingsController>().loadUserInfo(); |
|
|
|
// } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 更新用户名 |
|
|
|
Future<void> updateUserName(String name) async { |
|
|
|
if (name.trim().isEmpty) { |
|
|
|
Logger().e('Invalid name: $name'); |
|
|
|
Logger().e('无效名称: $name'); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -223,11 +288,11 @@ class ProfileController extends GetxController { |
|
|
|
userInfo.update((user) { |
|
|
|
if (user != null) { |
|
|
|
user.name = name.trim(); |
|
|
|
Logger().d('Name updated to: ${user.name}'); |
|
|
|
Logger().d('名称更新为: ${user.name}'); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
await saveUserInfo();//保存到本地 |
|
|
|
//await saveUserInfo(); //保存到本地 |
|
|
|
await _syncWithBackend(); //同步到后端 |
|
|
|
|
|
|
|
//同步更新 SettingsController |
|
|
|
@ -236,8 +301,8 @@ class ProfileController extends GetxController { |
|
|
|
settingsController.loadUserInfo(); |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
Logger().e('Error updating name: $e'); |
|
|
|
Get.snackbar('错误', 'Failed to update user name'); |
|
|
|
Logger().e('更新名称错误: $e'); |
|
|
|
Get.snackbar('错误', '更新用户名失败'); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|