Flutter下载更新App的方法示例

 更新时间:2019年07月17日 08:33:47   作者:破森图  
这篇文章主要介绍了Flutter下载更新App的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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 还有权限申请的问题。可以参考下面项目中的代码。

https://github.com/xushengjiang0/flutter_yuedu

dart 代码: lib/widget/update_version.dart

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

相关文章

  • Android Bitmap和Drawable的对比

    Android Bitmap和Drawable的对比

    这篇文章主要介绍了Android Bitmap和Drawable的对比的相关资料,需要的朋友可以参考下
    2017-05-05
  • Android 开发之dataBinding与ListView及事件

    Android 开发之dataBinding与ListView及事件

    这篇文章主要介绍了Android 开发之dataBinding与ListView及事件的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Android实现双击TitleBar回顶部的功能示例代码

    Android实现双击TitleBar回顶部的功能示例代码

    一个简单易用的导航栏TitleBar,可以轻松实现IOS导航栏的各种效果,下面这篇文章主要给大家介绍了关于Android如何实现双击TitleBar回顶部功能的相关资料,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Android自定义View绘制贝塞尔曲线中小红点的方法

    Android自定义View绘制贝塞尔曲线中小红点的方法

    贝塞尔曲线的本质是通过数学计算的公式来绘制平滑的曲线,分为一阶,二阶,三阶及多阶。但是这里不讲数学公式和验证,那些伟大的数学家已经证明过了,所以就只讲讲Android开发中的运用吧
    2023-02-02
  • 哔哩哔哩Android项目编译优化

    哔哩哔哩Android项目编译优化

    这篇文章主要为大家介绍了哔哩哔哩Android项目编译优化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • android Launcher AppWidget添加步骤介绍

    android Launcher AppWidget添加步骤介绍

    大家好,本篇文章主要讲的是android Launcher AppWidget添加步骤介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Android仿微信图片上传带加号且超过最大数隐藏功能

    Android仿微信图片上传带加号且超过最大数隐藏功能

    这篇文章给大家分享android仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • android 原生安全音量配置逻辑设计详解

    android 原生安全音量配置逻辑设计详解

    这篇文章主要为大家介绍了android 原生安全音量配置逻辑设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android利用ScaleTransition实现吹气球动画

    Android利用ScaleTransition实现吹气球动画

    这篇文章主要为大家介绍了如何将利用ScaleTransition实现一个吹气球的动画,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-04-04
  • Android自定义控件基本原理详解(一)

    Android自定义控件基本原理详解(一)

    这篇文章主要为大家详细介绍了Android自定义控件基本原理,了解一下自定义控件的要求和实现的基本原理,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论