大概思路,能进入这个帖子基本也都知道:
1.获取当前版本是否为低版本(略)
2.更新

方法一:

直接使用url_launcher:跳转本地浏览器下载
需要依赖url_launcher,版本号没有要求

url_launcher: ^5.0.2

currUrl:为下载地址

 _UpdateURL() async {if (await canLaunch(currUrl)) {await launch(currUrl);} else {throw 'Could not launch $currUrl';}}

方法二:

使用到的库,pubspec .yaml配置
分别是下载文件,获取路径,权限,打开文件

  flutter_downloader: ^1.1.7path_provider: ^1.1.0permission_handler: ^3.0.0open_file: ^2.0.1+2

Android manifest.xml配置

flutter_downloader:https://pub.dev/packages/flutter_downloader
⚠️:IOSIOS配置会有不同

 <providerandroid:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"android:authorities="${applicationId}.flutter_downloader.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider><providerandroid:name="androidx.work.impl.WorkManagerInitializer"android:authorities="${applicationId}.workmanager-init"android:enabled="false"android:exported="false" /><providerandroid:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"android:authorities="${applicationId}.flutter-downloader-init"android:exported="false"><meta-dataandroid:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"android:value="5" /></provider>

查看是否有权限

// 检查权限Future<bool> _checkPermission() async {if (Theme.of(context).platform == TargetPlatform.android) {PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);if (permission != PermissionStatus.granted) {Map<PermissionGroup, PermissionStatus> permissions =await PermissionHandler().requestPermissions([PermissionGroup.storage]);if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {return true;}} else {return true;}} else {return true;}return false;}

下载apk

把apk放在某位置,进行请求下载

  void _requestDownload() async {final path = await _apkLocalPath;final taskId = await FlutterDownloader.enqueue(url: 'https://github.com/alibaba/flutter-go/raw/master/FlutterGo.apk',savedDir: path,showNotification: true,// show download progress in status bar (for Android)openFileFromNotification:true, // click on notification to open downloaded file (for Android));}

监听下载进度

⚠️这里写在initState()方法中

 FlutterDownloader.registerCallback((id, status, progress) async {setState(() {_currProgress = progress;});print("id:${id}===== status=======:${status}=====progress======:${progress}");// 当下载完成时,调用安装if (status == DownloadTaskStatus.complete) {OpenFile.open(_localPath);FlutterDownloader.open(taskId: id);}});

ok 重点基本就到这里了,真机测

附上全部代码测试:

import 'dart:io';import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_go/blocs/bak/search_api.dart';
import 'dart:convert';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:open_file/open_file.dart';
import 'package:url_launcher/url_launcher.dart';class UpdatePage extends StatefulWidget {@override_UpdatePageState createState() => _UpdatePageState();
}class _UpdatePageState extends State<UpdatePage> {static const currUrl ='https://github.com/alibaba/flutter-go/raw/master/FlutterGo.apk';@overridevoid initState() {super.initState();FlutterDownloader.registerCallback((id, status, progress) async {setState(() {_currProgress = progress;});print("id:${id}===== status=======:${status}=====progress======:${progress}");// 当下载完成时,调用安装if (status == DownloadTaskStatus.complete) {OpenFile.open(_localPath);FlutterDownloader.open(taskId: id);}});_permissisonReady = false;_prepare();}bool _isLoading;bool _permissisonReady;String _localPath;int _currProgress = 0;@overrideWidget build(BuildContext context) {return Column(children: <Widget>[Container(margin: EdgeInsets.only(top: 20),width: double.infinity,height: 10.0,child: new LinearProgressIndicator(value: _currProgress / 100,backgroundColor: Colors.red,),),Center(child: Text("现在是1.0.0",textAlign: TextAlign.center, style: TextStyle(fontSize: 20)),),Center(child: FlatButton(onPressed: () {print("点击${_permissisonReady}");if (_permissisonReady) {_requestDownload();} else {_checkPermission().then((hasGranted) {setState(() {_permissisonReady = hasGranted;});});}},child: Text("点击获取新版本",style: TextStyle(color: Colors.white),),color: Colors.red[800],),),Center(child: FlatButton(onPressed: () {print("local===: _UpdateURL");_UpdateURL();},child: Text("更新版本",style: TextStyle(color: Colors.white),),color: Colors.red[800],),),],);}_UpdateURL() async {if (await canLaunch(currUrl)) {await launch(currUrl);} else {throw 'Could not launch $currUrl';}}Future<Null> _prepare() async {_permissisonReady = await _checkPermission();}//检查权限Future<bool> _checkPermission() async {if (Theme.of(context).platform == TargetPlatform.android) {PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);if (permission != PermissionStatus.granted) {Map<PermissionGroup, PermissionStatus> permissions =await PermissionHandler().requestPermissions([PermissionGroup.storage]);if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {return true;}} else {return true;}} else {return true;}return false;}void _requestDownload() async {final path = await _apkLocalPath;final taskId = await FlutterDownloader.enqueue(url: currUrl,fileName: "new_FlutterGo.apk",savedDir: path,showNotification: true,// show download progress in status bar (for Android)openFileFromNotification:true, // click on notification to open downloaded file (for Android));}// 获取安装地址Future<String> get _apkLocalPath async {//    final directory = widget.platform == TargetPlatform.android
//        ? await getExternalStorageDirectory()
//        : await getApplicationDocumentsDirectory();final directory = await getExternalStorageDirectory();_localPath = directory.path.toString();return _localPath;}
}

Flutter 项目 app迭代更新相关推荐

  1. flutter APP自动更新

    flutter APP自动更新 前言 在pubspec.yaml中安装依赖 在main.dart文件中,初始化FlutterDownLoader 配置网络 在AndroidManifest.xml新增 ...

  2. 最新网站生成APP源代码+Flutter项目/带控制端

    正文: 网站转换APP源代码,WebAPP源代码,网站生成APP源代码,Flutter项目+带控制端,这是一个功能超级强大的系统源码,演示图非常多,有兴趣自己看吧. 这是一款网站转换成APP的源代码, ...

  3. WordPress+Flutter开发APP教程:2.创建项目

    说明 本小节教程,将教您如何使用 Android Studio 创建一个 APP 目录 说明 开始 1.打开 Android Studio,并点击 新建flutter 项目 如下: 2.选flutte ...

  4. maven 强制更新_Android App内部更新Library的方法

    超详细!安卓巴士开发者大会嘉宾及主题介绍 AutoUpdateProject 最新版本及说明请关注GitHub,欢迎Star. 有什么意见与建议欢迎交流! github地址: https://gith ...

  5. flutter和webapp_Flutter全平台!迁移现有Flutter项目到WEB端

    写在前面 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS .Android.web和桌面 ...

  6. flutter不支持热更新_Flutter 在安卓上可以实现热更新了

    本文由 句号君 授权投稿 原文链接:https://blog.csdn.net/qizewei123/article/details/102963340 Flutter 官方在 GitHub 上声明是 ...

  7. Flutter 项目开发指导 从基础入门到精通使用目录

    Flutter 从入门 到精通系列文章 本文章为 Flutter 开发中的经验积累分享.教程分享.开发笔记分享目录,持续维护中. 题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Fl ...

  8. Flutter学习笔记02:初探Flutter项目

    文章目录 一.创建Flutter项目 二.项目目录文件说明 (一)android目录 (二)ios目录 (三)lib目录 (四)test目录 (五)pubspec.yaml文件 三.调试运行App ( ...

  9. Flutter系列(二)flutter项目打安装包

    一.安卓应用的apk安装包 推荐原文:AndroidStudio中Flutter打包APK - niceyoo - 博客园 (cnblogs.com) 学习后,整理记录一下步骤: 1.生成key 注意 ...

最新文章

  1. 厦门诺宝机器人_诺宝机器人编程软件
  2. 一、简谈Pandas
  3. QT的QStatusBar类的使用
  4. linux系统基础优化小结
  5. Linux系统下与终端相关的命令
  6. wx.checkjsapi是写在config里面吗_用Python写一个程序,解密游戏内抽奖的秘密
  7. 结束 Java、Python 之战,如何学习所有编程语言?
  8. 恢复初始快捷键_如何将Windows10系统还原初始状态
  9. 孙茂松教授——自然语言处理一瞥:知往鉴今瞻未来
  10. 并行程序设计---cuda memory
  11. 第二周函数-的基本格式:
  12. oracle数据库查表创建语句,转载:如何查看Oracle数据表的建表语句?
  13. 2005-2020POI数据 高德POI数据 高德信息点数据 百度POI数据分析下载
  14. 经典面试题:手机扫描二维码的测试用例(建议收藏)
  15. ​以数据科学家的眼光投资,你可能会一夜暴富
  16. iOS 播放系统自带铃声
  17. Unity导入图片尺寸大小和压缩格式的问题
  18. redis连接与关闭
  19. python最大公约数计算的程序代码_Python实现的求解最大公约数算法示例
  20. 糖尿病新世界杂志糖尿病新世界杂志社糖尿病新世界编辑部2022年第12期目录

热门文章

  1. QT5.15.2+QWT6.2.0 配置 综述
  2. 医疗HIS管理系统短信接入流程
  3. 有关 RichEdit line insertion error 报错的问题解答
  4. 深思4加密狗有驱无驱转换_可以将内部无线适配器转换为加密狗吗?
  5. 智能手环功能模块设计_基于51单片机的智能手环蓝牙模块设计
  6. 一招搞定win10网络图标显示问题-网络图标不见了
  7. 变异系数(测算数据离散程度相对指标)
  8. javascript生成二维码
  9. 白帽子讲web安全PDF完整版
  10. L1-029 是不是太胖了 (5 分)C语言