欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Flutter下载更新App的方法示例

程序员文章站 2022-04-28 17:46:46
1. 说明 ios 和android 更新是完全不一样的。 ios 只能跳转到 appstore,比较好实现 android则需要下载apk包,由于android机型...

1. 说明

ios 和android 更新是完全不一样的。

ios 只能跳转到 appstore,比较好实现

android则需要下载apk包,由于android机型较多,这里我们用 dart 连接第三方(这里)的原生 android 下载库。

更新界面和下载更新分开处理的。

ios 没得下载进度这一说,android 则有。

2. 代码

2.1 ios 直接采用url_launcher就可以了

if (platform.isios) {
 final url = "https://itunes.apple.com/cn/app/id1380512641"; // id 后面的数字换成自己的应用 id 就行了
 if (await canlaunch(url)) {
  await launch(url, forcesafarivc: false);
 } else {
  throw 'could not launch $url';
 }
}

2.1 android实现

2.1.1 在 android/app/build.gradle 文件添加下载库

dependencies {
  // 只复制这一行
  implementation 'com.king.app:app-updater:1.0.4-androidx'
}

2.1.2 在 androidmanifest.xml添加存储权限

<uses-permission android:name="android.permission.write_external_storage"/>
<uses-permission android:name="android.permission.read_external_storage"/>

2.1.3 在 android 项目中编写插件

package com.iwubida.flutter_yuedu.plugins;

import android.content.context;
import android.util.log;

import com.king.app.updater.appupdater;
import com.king.app.updater.callback.updatecallback;


import java.io.file;
import java.util.hashmap;
import java.util.map;

import io.flutter.plugin.common.eventchannel;

import io.flutter.plugin.common.pluginregistry.registrar;

/** updateversionplugin */
public class updateversionplugin implements eventchannel.streamhandler {

 private static string tag = "my_update";
 private static context context;

 public updateversionplugin(context context) {
  this.context = context;
 }

 /** plugin registration. */
 public static void registerwith(registrar registrar) {
  final eventchannel channel = new eventchannel(registrar.messenger(), "plugins.iwubida.com/update_version");
  channel.setstreamhandler(new updateversionplugin(registrar.context()));
 }


 @override
 public void onlisten(object o, eventchannel.eventsink eventsink) {

  if (o.tostring().length() < 5) {
   eventsink.error(tag, "url错误", o);
   return;
  }
  if (!o.tostring().startswith("http")){
   eventsink.error(tag, "url错误", o);
  }

  appupdater update = new appupdater(context,o.tostring()).setupdatecallback(new updatecallback() {

   map data = new hashmap<string, object>();

   // 发送数据到 flutter
   private void senddata() {
    eventsink.success(data);
   }

   @override
   public void ondownloading(boolean isdownloading) {

   }

   @override
   public void onstart(string url) {
    data.put("start", true);
    data.put("cancel", true);
    data.put("done", true);
    data.put("error", false);
    data.put("percent", 1);
    senddata();
   }

   @override
   public void onprogress(int progress, int total, boolean ischange) {
    int percent = (int)(progress * 1.0 / total * 100);
    if (ischange && percent > 0) {
     data.put("percent", percent);
     senddata();
    }
   }

   @override
   public void onfinish(file file) {
    data.put("done", true);
    senddata();
   }

   @override
   public void onerror(exception e) {
    data.put("error", e.tostring());
    senddata();
   }

   @override
   public void oncancel() {
    data.put("cancel", true);
    senddata();
   }
  });
  update.start();
 }

 @override
 public void oncancel(object o) {
  log.i(tag, "取消下载-集成的第三方下载没有提供取消方法");
 }
}

2.1.4 在 mainactivity 中注册插件

// 注册更新组件 在oncreate方法中
updateversionplugin.registerwith(registrarfor("iwubida.com/update_version"));

我们需要获取到下载进度,所以我们采用eventchannel来持续单向通讯。

2.3 dart端实现

static const channelname = 'plugins.iwubida.com/update_version';
 static const stream = const eventchannel(channelname);
 // 进度订阅
 streamsubscription downloadsubscription;
 int percent = 0;
 
  // 开始下载
 void _startdownload() {
  if (downloadsubscription == null) {
   downloadsubscription = stream
     .receivebroadcaststream(widget.data.apkurl)
     .listen(_updatedownload);
  }
 }

 // 停止监听进度
 void _stopdownload() {
  if (downloadsubscription != null) {
   downloadsubscription.cancel();
   downloadsubscription = null;
   percent = 0;
  }
 }

 // 进度下载
 void _updatedownload(data) {
  int progress = data["percent"];
  if (progress != null) {
   setstate(() {
    percent = progress;
   });
  }
 }
 

2.4 其它

另外 android 还有权限申请的问题。可以参考下面项目中的代码。


dart 代码: lib/widget/update_version.dart

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。