flutter 更新apk

Dart 复制代码
import 'package:path_provider/path_provider.dart';   //app_installer: ^1.0.0
import 'package:app_installer/app_installer.dart';    //path_provider

 //查询是否更新
  Future<void> ifUpdate(BuildContext buildContext) async {
    String jsonFlag = await LocalStorage.get("apkJson");
    var s = jsonFlag;
    var dio = Dio();
    final response = await dio.get(s);
    print(response.data);
    if(response.data != null){
      setState(() {

      });
      apkJson = response.data;   //json格式{"version":"3.0.1","outputFile":"http://192.168.200.201/test/news.apk","versionName":"ydhl"}
    }
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    //如果你设置的版本号 于你本机上的App的版本号 不一致 弹出下载框
    if (apkJson["version"] != "packageInfo.version") {
      print(packageInfo.version);
      Msg.dlg(context: context,title: "版本不是最新版,请确定是否更新").then((value)=>{
        if(value == ""){
          _installApk(apkJson["outputFile"])
          // download2()
        }
      });
    }else{
      toast("已是最新版");
    }
  }
Dart 复制代码
/// 下载安卓更新包
  Future downloadAndroid(String url) async {
    /// 创建存储文件
    Directory storageDir = await getExternalStorageDirectory();
    String storagePath = storageDir.path;
    final directory = await getTemporaryDirectory();
    File file = new File("${storageDir.path}/ydhl.apk");

    if (!file.existsSync()) {
      file.createSync();
    }
    try {
      /// 发起下载请求

      Response response = await Dio().download(url,file.path,
          options: Options(
            followRedirects: false,
          ),onProgress: (int count, int total){
            if (total != -1) {
              //更新界面进度
              _value = count / total;
              print("------"+_value.toString());
              setState(() {
                _value =_value;
              });
            }
          });
      // file.writeAsBytesSync(response.data);
      return file;
    } catch (e) {
      showError("下载失败");
      debugPrint(e.toString());
      setState(() {

      });
    }
  }
Dart 复制代码
/// 安装apk
  Future _installApk(String url) async {
    File _apkFile = await downloadAndroid(url);
    String _apkFilePath = _apkFile.path;

    if (_apkFilePath.isEmpty) {
      print("make sure the apk file is set");
      return;
    }
    AppInstaller.installApk(_apkFilePath)
        .then((ell){
      toast("下载成功");
    }).catchError((e){
      showError("install apk error: $e");
    });
  }

更新界面

与界面都在stack中

Dart 复制代码
Visibility(
          visible: (_value*100).toInt() != 0 && (_value*100).toInt() != 100,
          child: Stack(
            children: [
              Container(
                height: double.infinity,
                width: double.infinity,
                color: Colors.black12,
              ),
              Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Container(
                      child: Text("下载中...",style: TextStyle(
                        color: Colors.blue,
                          decoration: TextDecoration.none
                      ),),
                    ),
                    SizedBox(height: 10,),
                    SizedBox(
                      height: 20,
                      width: 300,
                      child: ClipRRect(
                        borderRadius: const BorderRadius.all(Radius.circular(100)),
                        child: LinearProgressIndicator(
                          value: _value,
                          backgroundColor: const Color(0xFF7E7F88).withOpacity(0.15),
                          valueColor: const AlwaysStoppedAnimation<Color>(Colors.green),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
相关推荐
前端大卫5 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友5 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
bing.shao7 小时前
Flutter 与 Native的比较
flutter
小李小李不讲道理7 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻7 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front8 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰8 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼989 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮9 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu200210 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员