直接上代码,粘贴复制即可使用: import 'package:get/get.dart'; import 'package:package_info/package_info.dart';
class AppUtils { static checkUpdate() async { PackageInfo info = await PackageInfo.fromPlatform(); dynamic ui = await HttpUtils.get(PortAddress.QY_UPDATE); if(ui != null) { if (info.version != ui['os-version']) { Get.dialog(WillPopScope( onWillPop: notWillPop, child: AlertDialog( title: Text('发现新版本 V' + ui['os-version']), content: AppUpdate(url: ui['url'], updateInfo: ui['update-info'], fileName: 'app' + '.' + ui['os-version'] + '.' + '1' + '.apk',), ), ) ); } } } static Future<bool> notWillPop() async { return false; } }
import 'dart:io'; import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart';
class AppUpdate extends StatefulWidget { final url; final updateInfo; final fileName; const AppUpdate({Key? key, this.url, this.updateInfo, this.fileName}) : super(key: key); @override _AppUpdateState createState() => _AppUpdateState(); } class _AppUpdateState extends State<AppUpdate> { double progressValue = 0.0; List<dynamic>? infoList; List<Widget>? wList;
@override void initState() { super.initState(); try { installApk(widget.url); } catch(e) { exit(0); } }
@override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text("${widget.updateInfo}"), SizedBox(height: 30.0,), LinearProgressIndicator( value: progressValue, backgroundColor: Colors.blueGrey, valueColor: AlwaysStoppedAnimation<Color>(Colors.pink), ) ], ); }
/// 安装apk Future<Null> installApk(String url) async { File _apkFile = await downloadAndroid(url); String _apkFilePath = _apkFile.path; if (_apkFilePath.isEmpty) { print('APK路径错误'); return; } await OpenFile.open(_apkFilePath); }
/// 下载安卓更新包 Future<File> downloadAndroid(String url) async { /// 创建存储文件 Directory? storageDir = await getExternalStorageDirectory(); String storagePath = storageDir!.path; File file = new File('$storagePath/${widget.fileName}'); // print('下载地址:${storagePath}'); if (!file.existsSync()) { file.createSync(); } try { /// 发起下载请求 Response response = await Dio().get(url, onReceiveProgress: showDownloadProgress, options: Options( responseType: ResponseType.bytes, followRedirects: false, )); // debugPrint('===请求headler: ${response.headers}'); file.writeAsBytesSync(response.data); return file; } catch (e) { print(e); } return file; } /// 展示下载进度 void showDownloadProgress(num received, num total) { if (total != -1) { double _progress = double.parse('${(received / total).toStringAsFixed(2)}'); setState(() { progressValue = _progress; }); } }
}