import 'package:app/core/utils/system.dart'; import 'package:app/core/utils/transfer/download.dart'; import 'package:app/data/models/common/version_dto.dart'; import 'package:app_installer/app_installer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:url_launcher/url_launcher.dart'; import '../base/button/index.dart'; import '../base/config/config.dart'; import '../base/tag/index.dart'; void showUpdateDialog(BuildContext context, VersionDto data){ //如果是最新版本 showGeneralDialog( context: context, barrierDismissible: false, barrierLabel: "Update", transitionDuration: const Duration(milliseconds: 300), pageBuilder: (context, animation, secondaryAnimation) { return PopScope( canPop: false, child: AppUpdateUi( version: data.latestVersion, updateNotice: data.updateContent, uploadUrl: data.downloadUrl, ), ); }, ); } ///下载状态枚举 enum UploadState { notStarted, //未开始下载 downloading, //下载中 completed, //下载完毕 } class AppUpdateUi extends StatefulWidget { final String version; final List updateNotice; final String uploadUrl; //下载地址 const AppUpdateUi({ super.key, required this.version, required this.updateNotice, required this.uploadUrl, }); @override State createState() => _UpdateUiState(); } class _UpdateUiState extends State { int _uploadProgress = 0; //下载进度 UploadState _uploadState = UploadState.notStarted; @override void initState() { super.initState(); getLocalApk(); } ///读取本地是否有下载记录 void getLocalApk() async { String url = await LocalDownload.getFilePath(url: widget.uploadUrl, path: '/apk'); if (url.isNotEmpty) { setState(() { _uploadState = UploadState.completed; }); } } ///下载apk void _handUploadApk() async { //如果是ios if(!isAndroid()){ _launchAppStore(); return; } if (_uploadState == UploadState.notStarted) { setState(() { _uploadState = UploadState.downloading; }); LocalDownload.downLoadFile( url: widget.uploadUrl, path: "/apk", onProgress: (double double) { setState(() { _uploadProgress = double.toInt(); }); }, onDone: (apk) async { setState(() { _uploadState = UploadState.completed; }); AppInstaller.installApk(apk); }, ); } else if (_uploadState == UploadState.completed) { String url = await LocalDownload.getFilePath(url: widget.uploadUrl, path: '/apk'); AppInstaller.installApk(url); } } ///跳转到appstore商店 void _launchAppStore() async{ final appStoreUrl = Uri.parse('itms-apps://itunes.apple.com/app/6757746410'); if (await canLaunchUrl(appStoreUrl)) { print("qq"); await launchUrl(appStoreUrl); } else { EasyLoading.showToast("无法打开App Store"); } } @override Widget build(BuildContext context) { String text; if (_uploadState == UploadState.downloading) { text = "$_uploadProgress%"; } else if (_uploadState == UploadState.completed) { text = '安装'; } else { text = '立即升级'; } return IntrinsicHeight( child: Container( color: Colors.transparent, padding: EdgeInsets.symmetric(horizontal: 40), alignment: Alignment.center, child: ConstrainedBox( constraints: BoxConstraints( maxWidth: 500, ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Stack( fit: StackFit.passthrough, children: [ Image.asset("assets/image/version_bg.png"), Positioned( top: 0, left: 0, right: 0, bottom: 0, child: DefaultTextStyle( style: TextStyle( fontSize: 16, color: Colors.white, fontWeight: FontWeight.w700, ), child: FractionalTranslation( translation: Offset(0.35, 0.3), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("发现新版本"), SizedBox(width: 10), Tag( text: "V ${widget.version}", type: ThemeType.warning, ), ], ), ), ), ), ], ), Material( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), child: Container( padding: EdgeInsets.all(15), width: double.infinity, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ...widget.updateNotice.asMap().entries.map((entry) { final index = entry.key; final item = entry.value; return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Text("${index + 1}.$item"), ); }), Container( margin: EdgeInsets.only(top: 20), height: 40, child: Button( onPressed: _uploadState == UploadState.downloading ? null : _handUploadApk, child: Text(text), ), ), ], ), ), ), ], ), ), ), ); } }