当前位置: 移动技术网 > IT编程>移动开发>Android > Flutter下载更新App的方法示例

Flutter下载更新App的方法示例

2019年09月06日  | 移动技术网IT编程  | 我要评论

金鱼的眼泪,古穿今之香江名媛,喜爱夜蒲3粤语完整版

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网