import 'package:get/get.dart'; import 'dart:io' show Platform; import 'package:url_launcher/url_launcher.dart'; import 'package:kaer_with_panels/app/widgets/dialogs/kr_update_dialog.dart'; import 'package:package_info_plus/package_info_plus.dart'; import '../localization/app_translations.dart'; import 'package:kaer_with_panels/app/utils/kr_log_util.dart'; import '../model/response/kr_config_data.dart'; /// 更新工具类 class KRUpdateUtil { /// 单例模式 static final KRUpdateUtil _instance = KRUpdateUtil._internal(); factory KRUpdateUtil() => _instance; KRUpdateUtil._internal(); /// 当前更新信息 KRUpdateApplication? _kr_currentUpdateInfo; /// 初始化更新信息 /// [updateInfo] 更新信息对象 void kr_initUpdateInfo(KRUpdateApplication updateInfo) { _kr_currentUpdateInfo = updateInfo; } /// 检查更新 Future kr_checkUpdate() async { if (_kr_currentUpdateInfo == null) { return; } // 获取当前应用版本号 final PackageInfo packageInfo = await PackageInfo.fromPlatform(); final String currentVersion = packageInfo.version; // 比较版本号 if (_kr_compareVersions(currentVersion, _kr_currentUpdateInfo!.kr_version) < 0) { _kr_showUpdateDialog(_kr_currentUpdateInfo!); } } /// 比较版本号 /// 返回值: /// -1: 当前版本小于目标版本 /// 0: 当前版本等于目标版本 /// 1: 当前版本大于目标版本 int _kr_compareVersions(String currentVersion, String targetVersion) { return currentVersion.compareTo(targetVersion); } /// 显示更新对话框 void _kr_showUpdateDialog(KRUpdateApplication updateInfo) { // 获取更新内容 String? updateContent = updateInfo.kr_version_description; // 如果更新内容为空,使用默认内容 if (updateContent?.isEmpty ?? true) { updateContent = AppTranslations.kr_update.content; } KRUpdateDialog.show( version: updateInfo.kr_version, updateContent: updateContent, onConfirm: () { _kr_handleUpdate(updateInfo); }, onCancel: () => Get.back(), showCancelButton: true, ); } /// 处理更新 Future _kr_handleUpdate(KRUpdateApplication updateInfo) async { if (updateInfo.kr_url.isEmpty) { Get.back(); return; } try { final Uri uri = Uri.parse(updateInfo.kr_url); if (Platform.isAndroid) { // Android 平台处理 await _kr_handleAndroidUpdate(uri); } else if (Platform.isIOS) { // iOS 平台处理 await _kr_handleIOSUpdate(uri); } else if (Platform.isMacOS) { // macOS 平台处理 await _kr_handleMacOSUpdate(uri); } else if (Platform.isWindows) { // Windows 平台处理 await _kr_handleWindowsUpdate(uri); } else if (Platform.isLinux) { // Linux 平台处理 await _kr_handleLinuxUpdate(uri); } } catch (e) { KRLogUtil.kr_e('更新处理错误: $e', tag: 'UpdateUtil'); } finally { Get.back(); } } /// 处理 Android 平台更新 Future _kr_handleAndroidUpdate(Uri uri) async { // Android 平台通常是下载 APK 文件 if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } } /// 处理 iOS 平台更新 Future _kr_handleIOSUpdate(Uri uri) async { // iOS 平台通常是跳转到 App Store if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } } /// 处理 macOS 平台更新 Future _kr_handleMacOSUpdate(Uri uri) async { // macOS 平台通常是下载 DMG 文件或跳转到 Mac App Store if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } } /// 处理 Windows 平台更新 Future _kr_handleWindowsUpdate(Uri uri) async { // Windows 平台通常是下载 exe 安装文件 if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } } /// 处理 Linux 平台更新 Future _kr_handleLinuxUpdate(Uri uri) async { // Linux 平台通常是下载安装包文件 if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } } }