Browse Source

refactor(权限): 统一权限请求的文本使用翻译键

feat(版本检查): 添加混合检查机制和会话级别标记

fix(模型): 将tourists字段设为可选并设置默认值

style(导入): 清理并统一相对导入路径

docs(翻译): 添加权限相关的新翻译文本

refactor(版本比较): 改进版本号比较逻辑
newdev_shunjiawei
lxm 1 year ago
parent
commit
06e6570dda
  1. 2
      lib/core/bindings/initial_binding.dart
  2. 41
      lib/core/translations/language/en_us.dart
  3. 31
      lib/core/translations/language/zh_cn.dart
  4. 27
      lib/core/utils/permission_util.dart
  5. 2
      lib/data/models/channel_app_model.dart
  6. 2
      lib/data/models/channel_app_model.g.dart
  7. 10
      lib/data/services/location_manager.dart
  8. 12
      lib/data/services/music_manager.dart
  9. 38
      lib/data/services/version_update_service.dart
  10. 117
      lib/modules/home/controllers/home_controller.dart
  11. 17
      lib/modules/login/controllers/login_controller.dart
  12. 6
      lib/modules/meeting/controllers/meeting_record_controller.dart
  13. 28
      lib/modules/pairing/controllers/pairing_controller.dart
  14. 2
      lib/modules/profile/controllers/profile_controller.dart
  15. 13
      lib/modules/settings/controllers/settings_controller.dart
  16. 36
      lib/modules/splash/controllers/splash_controller.dart
  17. 12
      lib/modules/translation/controllers/translation_controller.dart

2
lib/core/bindings/initial_binding.dart

@ -1,4 +1,4 @@
import 'package:deep_voice/data/services/user_portrait.dart';
import '../../../data/services/user_portrait.dart';
import '../../../data/services/location_manager.dart';
import '../../../data/services/music_manager.dart';

41
lib/core/translations/language/en_us.dart

@ -522,6 +522,47 @@ const Map<String, String> enUS = {
'You have permanently denied {permission} permission, please go to app settings to enable it',
'goToSettings': 'Go to Settings',
// 权限申请
'bluetoothScan': 'Bluetooth Scan',
'bluetoothConnect': 'Bluetooth Connect',
'bluetoothScanExplanation':
'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.',
'bluetoothConnectExplanation':
'The app needs Bluetooth connect permission to connect to Bluetooth devices.',
'locationForBluetoothExplanation':
'The app needs location permission to scan Bluetooth devices.',
'bluetoothScanPermanentDenial':
'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.',
'bluetoothConnectPermanentDenial':
'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.',
'notificationPermission': 'Notification',
'locationPermission': 'Location',
'notificationPermissionExplanation':
'Notification permission is required to display music playback status.',
'locationPermissionExplanation':
'Location permission is required to get current location.',
'notificationPermissionPermanentDenial':
'You have permanently denied notification permission, please go to settings to enable it.',
'locationPermissionPermanentDenial':
'You have permanently denied location permission, please go to settings to enable it.',
//'microphonePermission': 'Microphone',
'storagePermission': 'Storage',
'microphonePermissionExplanation':
'We need microphone permission to record audio content.',
'storagePermissionExplanation':
'We need storage permission so you can select and upload audio files.',
'microphonePermissionPermanentDenial':
'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.',
'storagePermissionPermanentDenial':
'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.',
//permission_util.dart
'permissionUtilNeed': 'Need ',
'permissionUtilPermission': ' Permission',
'permissionUtilRestricted': ' Permission Restricted',
'permissionUtilRestrictedMessage':
'This feature is unavailable or restricted on the current device, please check device settings or system restrictions',
'permissionUtilConfirm': 'OK',
// 版本更新对话框
'newVersionFound': 'New Version Found', // 版本更新对话框标题
'remindLater': 'Remind Later', // 稍后提醒按钮

31
lib/core/translations/language/zh_cn.dart

@ -482,6 +482,37 @@ const Map<String, String> zhCN = {
'permanentDenialText': '您已永久拒绝{permission}权限,请前往应用设置开启',
'goToSettings': '去设置',
// 权限申请
'bluetoothScan': '蓝牙扫描',
'bluetoothConnect': '蓝牙连接',
'bluetoothScanExplanation': '为了扫描附近的蓝牙设备,应用需要获取蓝牙扫描权限。',
'bluetoothConnectExplanation': '为了连接蓝牙设备,应用需要获取蓝牙连接权限。',
'locationForBluetoothExplanation': '为了扫描蓝牙设备,应用需要获取位置信息权限。',
'bluetoothScanPermanentDenial': '蓝牙扫描权限已被永久拒绝,请前往设置手动开启。',
'bluetoothConnectPermanentDenial': '蓝牙连接权限已被永久拒绝,请前往设置手动开启。',
'locationPermanentDenial': '位置信息权限已被永久拒绝,请前往设置手动开启。',
'notificationPermission': '通知',
'locationPermission': '定位',
'notificationPermissionExplanation': '需要通知权限来显示音乐播放状态。',
'locationPermissionExplanation': '需要定位权限来获取当前位置。',
'notificationPermissionPermanentDenial': '您已永久拒绝通知权限,请前往设置开启权限。',
'locationPermissionPermanentDenial': '您已永久拒绝定位权限,请前往设置开启权限。',
//'microphonePermission': '录音',
'storagePermission': '存储',
'microphonePermissionExplanation': '我们需要访问麦克风权限,以便您录制音频内容。',
'storagePermissionExplanation': '我们需要访问存储权限,以便您可以选择并上传音频文件。',
'microphonePermissionPermanentDenial':
'检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。',
'storagePermissionPermanentDenial':
'检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。',
//permission_util.dart
'permissionUtilNeed': '需要',
'permissionUtilPermission': '权限',
'permissionUtilRestricted': '权限受限',
'permissionUtilRestrictedMessage': '此功能在当前设备上不可用或受限,请检查设备设置或系统限制',
'permissionUtilConfirm': '确定',
// 版本更新对话框
'newVersionFound': '发现新版本', // 版本更新对话框标题
'remindLater': '稍后提醒', // 稍后提醒按钮

27
lib/core/utils/permission_util.dart

@ -42,9 +42,14 @@ class PermissionUtil {
required String permissionName,
required String explanationText,
required String permanentDenialText,
String settingsButtonText = '前往设置',
String cancelButtonText = '取消',
String? settingsButtonText,
String? cancelButtonText,
}) async {
// 使用翻译键作为默认值
final String finalSettingsButtonText =
settingsButtonText ?? 'goToSettings'.tr;
final String finalCancelButtonText = cancelButtonText ?? 'cancel'.tr;
try {
// 检查初始权限状态
final PermissionStatus status = await permissionType.status;
@ -73,8 +78,8 @@ class PermissionUtil {
// context: context,
permissionName: permissionName,
permanentDenialText: permanentDenialText,
settingsButtonText: settingsButtonText,
cancelButtonText: cancelButtonText,
settingsButtonText: finalSettingsButtonText,
cancelButtonText: finalCancelButtonText,
);
// 移除解释横幅
_hideExplanationOverlay();
@ -109,8 +114,8 @@ class PermissionUtil {
// context: context,
permissionName: permissionName,
permanentDenialText: permanentDenialText,
settingsButtonText: settingsButtonText,
cancelButtonText: cancelButtonText,
settingsButtonText: finalSettingsButtonText,
cancelButtonText: finalCancelButtonText,
);
_hideExplanationOverlay();
return result;
@ -171,7 +176,7 @@ class PermissionUtil {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'需要$permissionName权限',
'permissionUtilNeed'.tr + permissionName + 'permissionUtilPermission'.tr,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
@ -256,7 +261,7 @@ class PermissionUtil {
bool? userChoice = await Get.dialog(
AlertDialog(
title: Text('需要$permissionName权限'),
title: Text('permissionUtilNeed'.tr + permissionName + 'permissionUtilPermission'.tr),
content: Text(permanentDenialText),
actions: [
TextButton(
@ -301,8 +306,8 @@ class PermissionUtil {
Logger.w('PermissionUtil', '显示受限权限对话框 ($permissionName)');
Get.dialog(
AlertDialog(
title: Text('$permissionName权限受限'),
content: const Text('此功能在当前设备上不可用或受限,请检查设备设置或系统限制'),
title: Text(permissionName + 'permissionUtilRestricted'.tr),
content: Text('permissionUtilRestrictedMessage'.tr),
actions: [
TextButton(
onPressed: () {
@ -310,7 +315,7 @@ class PermissionUtil {
// Navigator.pop(context);
Get.back();
},
child: const Text('确定'),
child: Text('permissionUtilConfirm'.tr),
),
],
),

2
lib/data/models/channel_app_model.dart

@ -74,7 +74,7 @@ class AppInfo {
required this.channel,
required this.description,
required this.version,
required this.tourists,
this.tourists = false,
});
factory AppInfo.fromJson(Map<String, dynamic> json) =>

2
lib/data/models/channel_app_model.g.dart

@ -37,7 +37,7 @@ AppInfo _$AppInfoFromJson(Map<String, dynamic> json) => AppInfo(
channel: UserChannel.fromJson(json['channel']),
description: json['description'] as String,
version: json['version'] as String,
tourists: json['tourists'] as bool,
tourists: json['tourists'] as bool? ?? false,
);
Map<String, dynamic> _$AppInfoToJson(AppInfo instance) => <String, dynamic>{

10
lib/data/services/location_manager.dart

@ -23,11 +23,11 @@ class LocationManager extends GetxService {
final granted = await PermissionUtil.instance.requestPermission(
// context: context,
permissionType: Permission.locationAlways,
permissionName: '通知',
explanationText: '需要定位权限来获取当前位置。',
permanentDenialText: '您已永久定位通知权限,请前往设置开启权限。',
settingsButtonText: '去设置',
cancelButtonText: '取消',
permissionName: 'locationPermission'.tr,
explanationText: 'locationPermissionExplanation'.tr,
permanentDenialText: 'locationPermissionPermanentDenial'.tr,
settingsButtonText: 'goToSettings'.tr,
cancelButtonText: 'cancel'.tr,
);
if (!granted) {

12
lib/data/services/music_manager.dart

@ -28,13 +28,13 @@ class MusicManager extends GetxService {
Future<void> requestNotificationPermission() async {
final granted = await PermissionUtil.instance.requestPermission(
// context: context,
//context: context,
permissionType: Permission.notification,
permissionName: '通知',
explanationText: '需要通知权限来显示音乐播放状态。',
permanentDenialText: '您已永久拒绝通知权限,请前往设置开启权限。',
settingsButtonText: '去设置',
cancelButtonText: '取消',
permissionName: 'notificationPermission'.tr,
explanationText: 'notificationPermissionExplanation'.tr,
permanentDenialText: 'notificationPermissionPermanentDenial'.tr,
settingsButtonText: 'goToSettings'.tr,
cancelButtonText: 'cancel'.tr,
);
if (!granted) {

38
lib/data/services/version_update_service.dart

@ -7,6 +7,7 @@ import 'package:logger/logger.dart';
import 'package:device_info_plus/device_info_plus.dart';
import '../models/channel_app_model.dart';
import 'network/api.dart';
import 'dart:math' as math;
/// 版本更新服务类
class VersionUpdateService extends GetxService {
@ -128,7 +129,7 @@ class VersionUpdateService extends GetxService {
final response =
await Api.getChannelApp({'channel': platformInfo.channel.value});
print('获取渠道包信息:$response');
_logger.d('获取渠道包信息:$response');
if (response == null || !response.containsKey('app')) {
return VersionUpdateInfo(
@ -142,6 +143,7 @@ class VersionUpdateService extends GetxService {
//final channelAppResponse = ChannelAppResponse.fromJson(response);
// 直接从response中获取app信息
final appInfo = AppInfo.fromJson(response['app']);
_logger.d('获取到的最新版本信息: ${appInfo.toJson()}');
// 设置游客登录显示状态
isShowTourists.value = appInfo.tourists;
@ -170,8 +172,8 @@ class VersionUpdateService extends GetxService {
return VersionUpdateInfo(
hasUpdate: hasUpdate,
currentVersion: currentVersion,
latestVersion: appInfo.version,
currentVersion: currentVersion.split('+')[0],
latestVersion: appInfo.version.split('+')[0],
appInfo: appInfo,
updateType: updateType,
);
@ -204,7 +206,14 @@ class VersionUpdateService extends GetxService {
// 比较主版本号(第一位)
if (currentVersions.isNotEmpty && latestVersions.isNotEmpty) {
return currentVersions[0] != latestVersions[0];
if (currentVersions[0] != latestVersions[0]) {
return true;
}
}
// 检查是否有两个或更多的 + 号,如果有则强制更新
if (latest.split('+').length > 2) {
return true;
}
return false;
@ -218,24 +227,25 @@ class VersionUpdateService extends GetxService {
/// 返回true表示需要更新(远程版本更高)
bool _compareVersions(String current, String latest) {
// 拆分版本号与构建号
final currentParts = current.split('+');
final latestParts = latest.split('+');
final currentParts = current.split('+')[0];
final latestParts = latest.split('+')[0];
// 解析版本号 (major.minor.patch)
final currentVersions = currentParts[0].split('.').map(int.parse).toList();
final latestVersions = latestParts[0].split('.').map(int.parse).toList();
final currentVersions = currentParts.split('.').map(int.parse).toList();
final latestVersions = latestParts.split('.').map(int.parse).toList();
// 使用较小的长度进行比较,避免索引越界
final minLength = math.min(currentVersions.length, latestVersions.length);
// 逐级比较版本号
for (var i = 0; i < currentVersions.length; i++) {
for (var i = 0; i < minLength; i++) {
if (latestVersions[i] > currentVersions[i]) return true;
if (latestVersions[i] < currentVersions[i]) return false;
}
// 版本号相同则比较构建号
if (latestParts.length > 1 && currentParts.length > 1) {
return int.parse(latestParts[1]) > int.parse(currentParts[1]);
}
return false;
// 如果前面的版本号都相同,比较长度
// 更长的版本号被认为是更新的版本(如 1.0.1 > 1.0)
return latestVersions.length > currentVersions.length;
}
/// 解析版本号字符串为数字数组

117
lib/modules/home/controllers/home_controller.dart

@ -5,6 +5,9 @@ import '../../../core/utils/logger.dart';
import 'package:flutter/material.dart';
import '../../../data/services/bluetooth_manager.dart';
import '../../../data/services/ble_manager.dart';
import '../../../data/services/version_update_service.dart';
import '../../common/widgets/version_update_dialog.dart';
import 'package:get_storage/get_storage.dart';
/// 连接状态枚举
enum ConnectionStatus {
@ -50,6 +53,14 @@ class HomeController extends GetxController {
final _bluetoothManager = Get.find<BluetoothManager>();
final _bleManager = Get.find<BleManager>();
final _storage = GetStorage();
// 会话级别的版本检查标记(静态变量,整个应用会话期间保持)
static bool _hasCheckedVersionInSession = false;
// 版本检查相关常量
static const String _lastVersionCheckKey = 'last_version_check_timestamp';
static const int _versionCheckIntervalHours = 24; // 24小时间隔
@override
void onInit() {
super.onInit();
@ -67,6 +78,12 @@ class HomeController extends GetxController {
void _initWithCachedInfo() {
_setupStateListeners();
_checkConnectionStatus();
// 延迟检查版本更新,避免影响页面加载
// 混合检查机制:会话检查 + 24小时间隔检查
Future.delayed(const Duration(seconds: 2), () {
_checkVersionUpdateIfNeeded();
});
}
void _setupStateListeners() {
@ -253,4 +270,104 @@ class HomeController extends GetxController {
? deviceInfo.value!.firmwareVersion
: 'unknown'.tr;
}
/// 混合检查机制:判断是否需要进行版本检查
/// 检查条件:1. 会话内未检查过 OR 2. 距离上次检查超过24小时
void _checkVersionUpdateIfNeeded() {
try {
final now = DateTime.now();
final lastCheckTimestamp = _storage.read(_lastVersionCheckKey);
bool shouldCheck = false;
String reason = '';
// 条件1:会话内未检查过
if (!_hasCheckedVersionInSession) {
shouldCheck = true;
reason = '会话内首次检查';
}
// 条件2:距离上次检查超过24小时
else if (lastCheckTimestamp != null) {
final lastCheckTime = DateTime.fromMillisecondsSinceEpoch(lastCheckTimestamp);
final timeDifference = now.difference(lastCheckTime);
if (timeDifference.inHours >= _versionCheckIntervalHours) {
shouldCheck = true;
reason = '距离上次检查已超过${_versionCheckIntervalHours}小时';
}
}
// 条件3:从未检查过(首次使用应用)
else {
shouldCheck = true;
reason = '首次使用应用';
}
if (shouldCheck) {
Logger.i(_tag, '开始版本检查 - 原因: $reason');
_performVersionCheck();
} else {
Logger.i(_tag, '跳过版本检查 - 会话内已检查且未超过时间间隔');
}
} catch (e) {
Logger.e(_tag, '版本检查判断失败: $e');
}
}
/// 执行版本检查(在后台进行,不阻塞启动流程)
Future<void> _performVersionCheck() async {
try {
final versionService = VersionUpdateService.to;
final updateInfo = await versionService.checkForUpdate();
if (updateInfo.hasUpdate) {
Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}');
// 显示更新对话框
await VersionUpdateDialog.show(updateInfo);
} else {
Logger.i(_tag, '当前已是最新版本: ${updateInfo.currentVersion}');
}
// 更新检查记录
_updateVersionCheckRecord();
} catch (e) {
Logger.e(_tag, '版本检查失败: $e');
// 即使检查失败,也更新记录,避免频繁重试
_updateVersionCheckRecord();
}
}
/// 更新版本检查记录
void _updateVersionCheckRecord() {
try {
// 更新时间戳
final now = DateTime.now();
_storage.write(_lastVersionCheckKey, now.millisecondsSinceEpoch);
// 标记本次会话已检查过版本
_hasCheckedVersionInSession = true;
Logger.i(_tag, '版本检查记录已更新: ${now.toIso8601String()}');
} catch (e) {
Logger.e(_tag, '更新版本检查记录失败: $e');
}
}
/// 重置版本检查标记(可用于强制重新检查)
/// 注意:这会清除会话标记,但不会清除时间戳记录
static void resetVersionCheckFlag() {
_hasCheckedVersionInSession = false;
Logger.i('HomeCtrl', '版本检查会话标记已重置');
}
/// 完全重置版本检查状态(包括时间戳)
/// 用于测试或特殊情况下强制重新检查
void forceResetVersionCheck() {
try {
_hasCheckedVersionInSession = false;
_storage.remove(_lastVersionCheckKey);
Logger.i(_tag, '版本检查状态已完全重置');
} catch (e) {
Logger.e(_tag, '重置版本检查状态失败: $e');
}
}
}

17
lib/modules/login/controllers/login_controller.dart

@ -210,12 +210,12 @@ class LoginController extends GetxController {
//如果用户未接受隐私政策,显示弹窗
if (!_hasAcceptedPrivacy.value) {
_showPrivacyDialog();
}
});
} else {
_initDeviceInfo();
_initAppInfo(); // 新增:初始化APP信息
_checkGuestLoginConfig(); // 检查游客登录配置
}
});
}
@override
@ -229,7 +229,6 @@ class LoginController extends GetxController {
Future<void> _checkGuestLoginConfig() async {
try {
final versionService = VersionUpdateService.to;
await versionService.checkForUpdate();
// 先检查版本更新,这会同时设置 isShowTourists 的值
await versionService.checkForUpdate();
@ -388,6 +387,9 @@ class LoginController extends GetxController {
// 用户同意,关闭弹窗并继续
_hasAcceptedPrivacy.value = true;
Get.back();
_initDeviceInfo();
_initAppInfo(); // 新增:初始化APP信息
_checkGuestLoginConfig(); // 检查游客登录配置
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF0066CC),
@ -712,13 +714,6 @@ class LoginController extends GetxController {
//验证隐私协议勾选状态
if (!_hasAcceptedPrivacy.value) {
// Get.snackbar(
// 'tip'.tr,
// 'pleaseAcceptPrivacyPolicy'.tr,
// snackPosition: SnackPosition.TOP,
// backgroundColor: Colors.red.withOpacity(0.1),
// colorText: Colors.red,
// );
_showPrivacyDialog();
return;
}

6
lib/modules/meeting/controllers/meeting_record_controller.dart

@ -103,9 +103,9 @@ class MeetingRecordController extends GetxController
try {
final bool granted = await PermissionUtil.instance.requestPermission(
permissionType: Permission.microphone,
permissionName: "录音",
explanationText: "我们需要访问麦克风权限,以便您录制音频内容。",
permanentDenialText: "检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。",
permissionName: 'microphonePermission'.tr,
explanationText: 'microphonePermissionExplanation'.tr,
permanentDenialText: 'microphonePermissionPermanentDenial'.tr,
);
if (granted) {

28
lib/modules/pairing/controllers/pairing_controller.dart

@ -420,14 +420,30 @@ class PairingController extends GetxController {
Future<bool> _checkPermissions() async {
// Android权限检查
if (Platform.isAndroid) {
Logger.i(_tag, '开始检查Android权限');
// 检查蓝牙相关权限
final bluetoothScan = await Permission.bluetoothScan.request();
final bluetoothConnect = await Permission.bluetoothConnect.request();
final location = await Permission.locationWhenInUse.request();
final bluetoothScanGranted =
await PermissionUtil.instance.requestPermission(
permissionType: Permission.bluetoothScan,
permissionName: 'bluetoothScan'.tr,
explanationText: 'bluetoothScanExplanation'.tr,
permanentDenialText: 'bluetoothScanPermanentDenial'.tr,
);
final bluetoothConnectGranted =
await PermissionUtil.instance.requestPermission(
permissionType: Permission.bluetoothConnect,
permissionName: 'bluetoothConnect'.tr,
explanationText: 'bluetoothConnectExplanation'.tr,
permanentDenialText: 'bluetoothConnectPermanentDenial'.tr,
);
final locationGranted = await PermissionUtil.instance.requestPermission(
permissionType: Permission.locationWhenInUse,
permissionName: 'locationInfo'.tr,
explanationText: 'locationForBluetoothExplanation'.tr,
permanentDenialText: 'locationPermanentDenial'.tr,
);
return bluetoothScan.isGranted &&
bluetoothConnect.isGranted &&
location.isGranted;
return bluetoothScanGranted && bluetoothConnectGranted && locationGranted;
}
return true;
}

2
lib/modules/profile/controllers/profile_controller.dart

@ -1,4 +1,4 @@
import 'package:deep_voice/data/services/user_portrait.dart';
import '/data/services/user_portrait.dart';
import 'package:dio/dio.dart' as dio;
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';

13
lib/modules/settings/controllers/settings_controller.dart

@ -197,14 +197,6 @@ class SettingsController extends GetxController {
];
// 检查单个权限状态
Future<PermissionStatus> checkPermission(Permission permission) async {
return await permission.status;
}
// 请求单个权限
Future<PermissionStatus> requestPermission(Permission permission) async {
return await permission.request();
}
// 打开应用设置
void openSettings() {
@ -514,8 +506,9 @@ class SettingsController extends GetxController {
// 显示已是最新版本的提示
Get.snackbar(
'checkUpdate'.tr,
'currentLatestVersion' //当前已是最新版本
.trParams({'version': updateInfo.currentVersion}),
'currentLatestVersion'
.tr //当前已是最新版本
.replaceAll('{version}', updateInfo.currentVersion),
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.green.withOpacity(0.8),
colorText: Colors.white,

36
lib/modules/splash/controllers/splash_controller.dart

@ -76,7 +76,7 @@ class SplashController extends GetxController {
// await _initDatabase();
// 检查版本更新(在后台进行,不阻塞启动流程)
_checkVersionUpdate();
//_checkVersionUpdate();
_isResourceLoaded.value = true;
_checkNavigateCondition();
@ -158,21 +158,21 @@ class SplashController extends GetxController {
}
/// 检查版本更新(后台执行,不阻塞启动流程)
void _checkVersionUpdate() {
// 延迟执行版本检查,避免影响启动速度
Timer(const Duration(seconds: 1), () async {
try {
final versionService = VersionUpdateService.to;
final updateInfo = await versionService.checkForUpdate();
if (updateInfo.hasUpdate) {
// 显示更新对话框
await VersionUpdateDialog.show(updateInfo);
}
} catch (e) {
print('版本检查失败: $e');
// 版本检查失败不影响用户使用,静默处理
}
});
}
// void _checkVersionUpdate() {
// // 延迟执行版本检查,避免影响启动速度
// Timer(const Duration(seconds: 1), () async {
// try {
// final versionService = VersionUpdateService.to;
// final updateInfo = await versionService.checkForUpdate();
// if (updateInfo.hasUpdate) {
// // 显示更新对话框
// await VersionUpdateDialog.show(updateInfo);
// }
// } catch (e) {
// print('版本检查失败: $e');
// // 版本检查失败不影响用户使用,静默处理
// }
// });
// }
}

12
lib/modules/translation/controllers/translation_controller.dart

@ -224,9 +224,9 @@ class TranslationController extends GetxController {
try {
final bool granted = await PermissionUtil.instance.requestPermission(
permissionType: Permission.microphone,
permissionName: "录音",
explanationText: "我们需要访问麦克风权限,以便您录制音频内容。",
permanentDenialText: "检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。",
permissionName: 'microphonePermission'.tr,
explanationText: 'microphonePermissionExplanation'.tr,
permanentDenialText: 'microphonePermissionPermanentDenial'.tr,
);
if (granted) {
@ -248,9 +248,9 @@ class TranslationController extends GetxController {
try {
final bool granted = await PermissionUtil.instance.requestPermission(
permissionType: Permission.storage,
permissionName: "存储",
explanationText: "我们需要访问存储权限,以便您可以选择并上传音频文件。",
permanentDenialText: "检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。",
permissionName: 'storagePermission'.tr,
explanationText: 'storagePermissionExplanation'.tr,
permanentDenialText: 'storagePermissionPermanentDenial'.tr,
);
if (granted) {

Loading…
Cancel
Save