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.
210 lines
5.6 KiB
210 lines
5.6 KiB
import 'package:firebase_auth/firebase_auth.dart' as firebase;
|
|
import 'package:get/get.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:image_picker/image_picker.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 '../../../data/models/user_model.dart';
|
|
import '../../../data/models/user_Info.dart';
|
|
|
|
class SettingsController extends GetxController {
|
|
// 语言设置
|
|
final List<LanguageModel> 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<LanguageModel> 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<String> availableLanguages = [
|
|
'中文',
|
|
'英文',
|
|
'日文',
|
|
'韩文',
|
|
'法文',
|
|
'德文',
|
|
'西班牙文',
|
|
'俄文'
|
|
];
|
|
|
|
// 语音服务类型
|
|
final Rx<SpeechServiceType> speechServiceType = SpeechServiceType.azure.obs;
|
|
final List<Map<String, dynamic>> availableSpeechServices = [
|
|
{
|
|
'type': SpeechServiceType.azure,
|
|
'name': 'azureVoiceService', // Azure 语音服务.tr
|
|
'description': 'azureVoiceServiceInfo' // 微软云端语音服务,支持高质量语音合成和识别.tr
|
|
},
|
|
{
|
|
'type': SpeechServiceType.flutter,
|
|
'name': 'flutterVoiceService', // Flutter 本地语音服务.tr
|
|
'description': 'flutterVoiceServiceInfo' // 设备本地语音服务,无需联网即可使用.tr
|
|
},
|
|
];
|
|
|
|
//用户信息
|
|
static const String userKey='user_info';
|
|
//final _storage=GetStorage();
|
|
final ImagePicker _picker=ImagePicker();
|
|
final Rx<User> userInfo=User.instance.obs;//使用单例实例
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
|
|
// 获取系统语言
|
|
_getLanguage();
|
|
|
|
// 从存储中加载上次保存的主题设置
|
|
final savedDarkMode = _themeService.isSavedDarkMode();
|
|
|
|
// 设置当前主题状态
|
|
isDarkMode.value = savedDarkMode;
|
|
|
|
// 获取当前语音服务类型
|
|
_loadCurrentSpeechServiceType();
|
|
|
|
//获取用户信息
|
|
loadUserInfo();
|
|
}
|
|
|
|
void loadUserInfo() {
|
|
final userJson = _storage.read(userKey);
|
|
if (userJson != null) {
|
|
userInfo.value = User.instance;
|
|
}
|
|
}
|
|
|
|
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) {
|
|
userInfo.update((user) {
|
|
if (user != null) {
|
|
user.avatar = image.path;
|
|
}
|
|
});
|
|
await saveUserInfo();
|
|
}
|
|
}
|
|
|
|
Future<void> updateUserName(String name) async {
|
|
if (name.trim().isNotEmpty) {
|
|
userInfo.update((user) {
|
|
if (user != null) {
|
|
user.name = name.trim();
|
|
}
|
|
});
|
|
await saveUserInfo();
|
|
}
|
|
}
|
|
|
|
// Future<void> 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 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<SpeechFactory>();
|
|
speechServiceType.value = factory.currentServiceType;
|
|
} catch (e) {
|
|
// 如果找不到SpeechFactory实例,使用默认值
|
|
}
|
|
}
|
|
|
|
// 切换主题
|
|
Future<void> 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<SpeechFactory>();
|
|
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;
|
|
}
|
|
|
|
void signOut() {
|
|
// 在此实现退出登录逻辑
|
|
Get.offAllNamed('/login');
|
|
}
|
|
}
|
|
|