中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter下載更新App的方法示例

發布時間:2020-08-26 16:21:04 來源:腳本之家 閱讀:103 作者:破森圖 欄目:移動開發

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

库尔勒市| 桐乡市| 江阴市| 万载县| 宁陵县| 建瓯市| 南召县| 藁城市| 宜宾县| 浙江省| 黑水县| 屏南县| 上思县| 赤水市| 鹤岗市| 乐平市| 衡山县| 定日县| 红桥区| 北宁市| 铜山县| 仙游县| 嘉兴市| 海兴县| 宝鸡市| 丰顺县| 汶上县| 宿松县| 平顺县| 揭西县| 襄汾县| 德钦县| 芜湖县| 凉山| 鹤山市| 遵化市| 德江县| 万荣县| 宝鸡市| 广宗县| 远安县|