欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:Flutter APP下載更新

柚子快報邀請碼778899分享:Flutter APP下載更新

http://yzkb.51969.com/

由于我做的項目不是放在APP商店(公司內(nèi)部用)的,一些flutter的第三方庫不合適我,我需要用的是從網(wǎng)上下載再安裝(從服務(wù)下),網(wǎng)上也找了花了我好幾天時間。不全又亂,這我自己做一下備份

現(xiàn)在只使用安卓下載,ios沒有做(后期可能更新)

app更新要求

1.進入app就查看app是否要更新(更新對比自己寫)

2.下載完成可以自動彈窗安裝界面

正式開始

1.使用第三方庫

dependencies:

# 查詢應(yīng)用程序包信息

package_info_plus: ^5.0.1

# 創(chuàng)建和管理下載任務(wù)的插件

flutter_downloader: ^1.11.6

# 安裝插件,打開安裝界面

install_plugin: ^2.1.0

# 權(quán)限處理程序

permission_handler: ^11.3.0

# 用于比較和遞增版本號

version: ^3.0.2

2.權(quán)限

添加權(quán)限

android\app\src\main\AndroidManifest.xml

manifest需要加上xmlns:tools="http://schemas.android.com/tools",

不然可能報錯

android:label="cpm"

android:name="${applicationName}"

android:icon="@mipmap/launcher_icon">

android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"

android:authorities="${applicationId}.flutter_downloader.provider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/provider_paths"/>

android:name="androidx.startup.InitializationProvider"

android:authorities="${applicationId}.androidx-startup"

android:exported="false"

tools:node="merge">

android:name="androidx.work.WorkManagerInitializer"

android:value="androidx.startup"

tools:node="remove" />

android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"

android:authorities="${applicationId}.flutter-downloader-init"

android:exported="false">

android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"

android:value="5" />

如果你是HTTP下載的

允許訪問明文HTTP流量

你可能要通過這個去添加http下載權(quán)限

報錯關(guān)鍵詞: Cleartext HTTP traffic to xxx not permitted

3.初始化

import 'package:flutter_downloader/flutter_downloader.dart';

import './utils/update_app.dart';// 等下要做的更新方法

void main() async {

// 下載器 插件在使用前必須初始化

await FlutterDownloader.initialize(

debug: true, // 可選:設(shè)置為false以禁用將日志打印到控制臺(默認(rèn):true)

ignoreSsl: true, // 選項:設(shè)置為false以禁用HTTP鏈接(默認(rèn)值:false)

);

// 更新App

await updateApp();

runApp(const MyApp());

}

4.更新方法

前置工作

這使用get庫的二次封裝彈窗,這個彈窗自行實現(xiàn),不然代碼太多了。主要看注釋下的代碼

import 'package:get/get.dart';

import 'package:flutter/material.dart';

/// 更新App

updateApp() async {

// 是否有最新版本

bool isUpdate = await isNewVersions();

if (!isUpdate) {

debugPrint('暫不用更新');

return;

}

// 等頁面加載完后再執(zhí)行后面的,這個是重點,你剛進App大概是沒有加載完頁面的

WidgetsBinding.instance.addPostFrameCallback((_) async {

confirmDialog(

title: '更新程序',

textCancel: '稍后',

textConfirm: '現(xiàn)在更新',

isVerticalLayout: false,

onCancel: () => Get.back(),// 關(guān)閉彈窗

onConfirm: () async {

// 下載監(jiān)聽

bindBackgroundIsolate();

// 下載

await downloaderApp();

// 這是另一個方法,后面講

// _networkInstallApk();

},

);

});

}

/// 檢查是否有新的版本要更新

isNewVersions() async {

PackageInfo packageInfo = await PackageInfo.fromPlatform();

Version version = Version.parse(packageInfo.version);

// 請求過來的版本號,自行請求,或者你有別的實現(xiàn)方法

Version request = Version.parse('0.3.0');

debugPrint('APP_版本:$version,請求_版本:$request,是否有最新的版本:${version < request}');

// 6 * 6 = 36

// 當(dāng)請求的版本大時就有新的,有新的就返回為true

return request > version;

}

方法1,使用flutter_downloader下載

其實我這下面與上面的代碼放一起的,比較方便,當(dāng)然主要還是看個人怎么做

import 'dart:isolate';

import 'dart:ui';

import 'package:cpm/utils/gadget.dart';

import 'package:flutter/material.dart';

import 'package:flutter_downloader/flutter_downloader.dart';

import 'package:install_plugin/install_plugin.dart';

final ReceivePort _port = ReceivePort(); // 聲明接收端口

// 下載文件地址,這個是install_plugin庫提供的apk文件地址,可以測試使用

String url = 'https://s3.cn-north-1.amazonaws.com.cn/mtab.kezaihui.com/apk/takeaway_phone_release_1.apk';

String fileName = 'downloader_send_port'; //文件名

final isDown = false.obs; // 下載狀態(tài)

dynamic taskId = 0; // 文件下載ID

String savedDir = ''; // 本地文件夾路徑

RxString percent = '0'.obs; // 下載進度,這我是使用Get庫的狀態(tài)管理準(zhǔn)備顯示在頁面的

// 下載文檔

Future downloaderApp() async {

debugPrint('準(zhǔn)備下載。檢查有沒有存儲權(quán)限');

bool isStorage = await checkPermissionStorage();

if (!isStorage) {

debugPrint('沒有存儲權(quán)限');

return;

}

savedDir = await findLocalPath();

debugPrint('下載中...');

isDown.value = true;

taskId = await FlutterDownloader.enqueue(

url: url, // 鏈接文件下載

savedDir: savedDir, // 本地文件夾路徑

fileName: fileName, //文件名

showNotification: true, // 在狀態(tài)欄顯示下載進度(適用于Android)

openFileFromNotification: true, // 點擊通知打開下載的文件(適用于Android)

);

// 更新下載進度

await FlutterDownloader.registerCallback(Download.downloadCallback);

}

/// 下載監(jiān)聽

void bindBackgroundIsolate() {

final isSuccess = IsolateNameServer.registerPortWithName(_port.sendPort, fileName);

if (!isSuccess) {

_unbindBackgroundIsolate();

bindBackgroundIsolate();

return;

}

_port.listen((dynamic data) async {

///重新下載狀態(tài)

isDown.value = false;

dynamic status = data[1];

// 在這賦值進度變量

percent.value = (data[2] as int).toString();

print('data:$data');

if (status == 3) {

//程序休眠1s,保證下載事項處理完成

await Future.delayed(const Duration(seconds: 1));

print('下載成功,正在打開');

await localInstallApk('$savedDir/$fileName');

//

_unbindBackgroundIsolate();

} else if (status == 4) {

print('下載失敗');

_unbindBackgroundIsolate();

}

});

// 默認(rèn)進度為10間隔修改一次,可以在這加一個step: 1參數(shù),可以隔1就回調(diào)一次

FlutterDownloader.registerCallback(Download.downloadCallback);

}

// 打開安裝界面

localInstallApk(String path) async {

final res = await InstallPlugin.install(path);

debugPrint("應(yīng)用安裝器 ${res['isSuccess'] == true ? 'success' : 'fail:${res['errorMessage'] ?? ''}'}");

}

/// 釋放監(jiān)聽

void _unbindBackgroundIsolate() => IsolateNameServer.removePortNameMapping(fileName);

/// 注冊監(jiān)聽事件,因為要靜態(tài)方法,所以做一個類才行

class Download {

@pragma('vm:entry-point')

static void downloadCallback(

String id,

int status,

int progress,

) {

IsolateNameServer.lookupPortByName(fileName)?.send([id, status, progress]);

// print('下載任務(wù):$id,處于狀態(tài):$status,進度為: $progress');

}

}

還有兩個方法,由于可能其它地方也會用到,我就做成通用方法,

你需要把這兩個方法引入,或者你自己放到同一個文件

import 'dart:io';

import 'package:path_provider/path_provider.dart' as path_provider;

import 'package:permission_handler/permission_handler.dart';

/// 查找本地文件路徑并返回路徑字符串

/// - [path] 緩沖文件的文件名,默認(rèn)就是`Download`

/// - 描述:設(shè)備上沒有備份的臨時目錄的路徑,適合存放下載文件的緩存。

/// - 注意:`path`參數(shù)第一位不能是`/`

Future findLocalPath({String path = 'Download'}) async {

final directory = Platform.isAndroid

? await path_provider.getExternalStorageDirectory()

: await path_provider.getApplicationSupportDirectory();

String localPath = '${directory?.path}/$path';

final savedDir = Directory(localPath);

bool hasExisted = await savedDir.exists();

if (!hasExisted) {

savedDir.create();

}

return localPath;

}

/// 檢查設(shè)備存儲權(quán)限并請求權(quán)限(如果未授予)

Future checkPermissionStorage() async {

// 獲取存儲權(quán)限的當(dāng)前狀態(tài)

var status = await Permission.storage.status;

// 如果存儲權(quán)限未被授予,則請求權(quán)限

if (!status.isGranted) {

status = await Permission.storage.request();

// 如果權(quán)限請求被授予,返回true

if (status.isGranted) {

return true;

}

} else {

// 如果權(quán)限已經(jīng)授予,或者權(quán)限請求被拒絕,返回true

return true;

}

// 如果所有條件都不符合,返回false

return false;

}

方法2,使用dio下載

這個我沒有在上面的第三方庫寫dio進去,因為我覺得你會有一個http請求庫的。

這個是直接下載的沒有暫停的什么功能,好處就是很直接的下載

// 網(wǎng)絡(luò)上下載apk

_networkInstallApk() async {

var progressValue = 0.0;

var savePath = await getTemporaryDirectory('takeaway_phone_release_1.apk');

// url 就是上面的那一個

await Dio().download(url, savePath, onReceiveProgress: (count, total) {

final value = count / total;

//

if (progressValue != value) {

if (progressValue < 1.0) {

progressValue = count / total;

} else {

progressValue = 0.0;

}

debugPrint("${(progressValue * 100).toStringAsFixed(2)}%");

}

});

final res = await InstallPlugin.install(savePath);

debugPrint(

"install apk ${res['isSuccess'] == true ? 'success' : 'fail:${res['errorMessage'] ?? ''}'}");

}

柚子快報邀請碼778899分享:Flutter APP下載更新

http://yzkb.51969.com/

參考文章

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19289446.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄