import 'app_market.dart'; import 'app_upgrade_method.dart'; /// App升级信息模型 class UpgradeInfo { /// 是否有新版本 final bool hasUpdate; /// 是否强制更新 final bool isForceUpdate; /// 版本号 final int versionBuildNumber; /// 版本名称 final String versionName; /// 当前版本号 final int currentBuildNumber; /// 当前版本名称 final String currentVersionName; /// 更新说明 final String updateContent; /// 下载地址(Android APK地址) final String? downloadUrl; /// App Store地址(iOS) final String? appStoreUrl; /// APK文件大小(字节) final int? apkSize; /// APK MD5值(用于校验) final String? apkMd5; /// 应用商店白名单(用于Android多渠道更新) /// 配置后,只允许跳转到白名单中且设备已安装的应用市场 /// 如果设备上没有白名单中的任何应用市场,将提示用户选择其他更新方式 final List? appMarkets; /// 支持的更新方式 final List supportedMethods; UpgradeInfo({ this.hasUpdate = false, required this.isForceUpdate, required this.versionBuildNumber, required this.versionName, required this.updateContent, required this.currentBuildNumber, required this.currentVersionName, this.downloadUrl, this.appStoreUrl, this.apkSize, this.apkMd5, this.appMarkets, this.supportedMethods = const [AppUpgradeMethod.market, AppUpgradeMethod.browser, AppUpgradeMethod.inApp], }); /// 从JSON创建 /// [currentBuildNumber] 当前版本号 /// [currentVersion] 当前版本名称 factory UpgradeInfo.fromJson( Map json, { required int currentBuildNumber, required String currentVersionName, }) { final versionBuildNumber = json['versionBuildNumber']; final versionName = json['versionName']; // 解析 supportedMethods List supportedMethods; if (json['supportedMethods'] != null) { supportedMethods = (json['supportedMethods'] as List).map((e) { // 这里假设JSON中传的是索引或字符串,简单起见,如果是内部使用,通常不会有这个字段 // 除非是从 AppUpgradeVersion 传过来。 // 如果是原生传过来的,我们需要约定格式。 // 暂时默认为全支持,或者如果提供了就解析。 // 简单处理:如果是字符串列表 if (e is String) { switch (e) { case 'market': return AppUpgradeMethod.market; case 'browser': return AppUpgradeMethod.browser; case 'inApp': return AppUpgradeMethod.inApp; default: return AppUpgradeMethod.inApp; } } // 如果是索引 if (e is int && e >= 0 && e < AppUpgradeMethod.values.length) { return AppUpgradeMethod.values[e]; } return AppUpgradeMethod.inApp; }).toList(); } else { supportedMethods = [AppUpgradeMethod.market, AppUpgradeMethod.browser, AppUpgradeMethod.inApp]; } return UpgradeInfo( hasUpdate: versionBuildNumber != currentBuildNumber || versionName != currentVersionName, isForceUpdate: json['isForceUpdate'] ?? false, versionBuildNumber: versionBuildNumber, versionName: versionName, currentBuildNumber: currentBuildNumber, currentVersionName: currentVersionName, updateContent: json['updateContent'] ?? '', downloadUrl: json['downloadUrl'] as String?, appStoreUrl: json['appStoreUrl'] as String?, apkSize: json['apkSize'] as int?, apkMd5: json['apkMd5'] as String?, appMarkets: (json['appMarkets'] as List?)?.map((e) => AppMarket.fromString(e as String)).toList(), supportedMethods: supportedMethods, ); } Map toJson() { return { 'hasUpdate': hasUpdate, 'isForceUpdate': isForceUpdate, 'versionBuildNumber': versionBuildNumber, 'versionName': versionName, 'updateContent': updateContent, 'currentBuildNumber': currentBuildNumber, 'currentVersionName': currentVersionName, 'downloadUrl': downloadUrl, 'appStoreUrl': appStoreUrl, 'apkSize': apkSize, 'apkMd5': apkMd5, 'appMarkets': appMarkets?.map((e) => e.name).toList(), 'supportedMethods': supportedMethods.map((e) => e.name).toList(), }; } @override String toString() { return 'UpgradeInfo(hasUpdate: $hasUpdate, isForceUpdate: $isForceUpdate, versionBuildNumber: $versionBuildNumber, versionName: $versionName, currentBuildNumber: $currentBuildNumber, currentVersionName: $currentVersionName, updateContent: $updateContent, appStoreUrl: $appStoreUrl, apkSize: $apkSize, apkMd5: $apkMd5, appMarkets: $appMarkets, supportedMethods: $supportedMethods)'; } } /// 下载进度信息 class DownloadProgress { /// 已下载字节数 final int received; /// 总字节数 final int total; /// 下载进度(0.0 - 1.0) double get progress => total > 0 ? received / total : 0.0; /// 进度百分比(0 - 100) int get percentage => (progress * 100).toInt(); DownloadProgress({required this.received, required this.total}); }