【重磅發布】flutter_chen_updater-版本升級更新

Flutter Chen Updater

一個功能強大的Flutter應用內更新插件,支持Android APK自動下載、安裝和iOS跳轉App Store。

? 特性

  • ? 跨平臺支持: Android APK自動更新,iOS跳轉App Store
  • ? 智能下載: 支持斷點續傳、文件校驗、多重備用方案
  • ? 權限管理: 自動處理Android安裝權限、存儲權限
  • ? 強制更新: 支持可選更新和強制更新模式
  • ? 進度監控: 實時下載進度回調
  • ? 文件校驗: MD5文件完整性驗證
  • ? 生命周期管理: 智能處理應用前后臺切換
  • ? 自定義UI: 支持自定義更新對話框

效果預覽

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

📦 安裝

在你的 pubspec.yaml 文件中添加依賴:

dependencies:flutter_chen_updater: ^1.0.0

然后運行:

flutter pub get

?? 權限配置

Android

android/app/src/main/AndroidManifest.xml 中添加必要權限:

<!-- 網絡權限 -->
<uses-permission android:name="android.permission.INTERNET" /><!-- 存儲權限 (Android 9及以下) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" /><!-- 安裝權限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><!-- 網絡狀態權限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

🚀 基礎用法

1. 簡單更新檢查

import 'package:flutter_chen_updater/flutter_chen_updater.dart';void checkForUpdate() {final updateInfo = UpdateInfo(version: '1.1.0',downloadUrl: 'https://example.com/app-v1.1.0.apk',iosUrl: 'https://apps.apple.com/app/id123456789',description: '1. 修復已知問題\n2. 優化用戶體驗\n3. 新增功能特性',isForceUpdate: false,);Updater.checkAndUpdate(context,updateInfo,onAlreadyLatest: () => print('已是最新版本'),onConfirm: () => print('用戶確認更新'),onCancel: () => print('用戶取消更新'),);
}

2. 帶進度監控的更新

void checkForUpdateWithProgress() {final updateInfo = UpdateInfo(version: '1.1.0',downloadUrl: 'https://example.com/app-v1.1.0.apk',description: '更新說明',fileHash: 'abc123def456', // 可選:文件MD5校驗hashAlgorithm: 'md5',fileSize: 15 * 1024 * 1024, // 15MB);Updater.checkAndUpdate(context,updateInfo,onProgress: (progress) {print('下載進度: ${(progress.progress * 100).toStringAsFixed(1)}%');print('已下載: ${progress.downloaded} / ${progress.total}');},onConfirm: () => print('開始下載更新'),);
}

3. 強制更新示例

void forceUpdate() {final updateInfo = UpdateInfo(version: '2.1.0',description: '重要安全更新,請立即升級',downloadUrl: 'https://example.com/app-v2.1.0.apk',isForceUpdate: true, // 強制更新,用戶無法取消);Updater.checkAndUpdate(context, updateInfo);
}

4. 自定義對話框

4.1 使用 dialogBuilder 自定義
Future<bool> customDialog(BuildContext context, UpdateInfo updateInfo) {return showDialog<bool>(context: context,barrierDismissible: !updateInfo.isForceUpdate,builder: (context) => AlertDialog(title: Text('發現新版本 ${updateInfo.version}'),content: Column(mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.start,children: [Text(updateInfo.description),if (updateInfo.fileSize != null)Padding(padding: const EdgeInsets.only(top: 8.0),child: Text('大小: ${(updateInfo.fileSize! / 1024 / 1024).toStringAsFixed(1)}MB'),),],),actions: [if (!updateInfo.isForceUpdate)TextButton(onPressed: () => Navigator.pop(context, false),child: const Text('稍后更新'),),ElevatedButton(onPressed: () => Navigator.pop(context, true),child: const Text('立即更新'),),],),) ?? false;
}void checkWithCustomDialog() {final updateInfo = UpdateInfo(version: '1.1.0',downloadUrl: 'https://example.com/app.apk',description: '重要更新說明',);Updater.checkAndUpdate(context,updateInfo,dialogBuilder: customDialog,);
}
4.2 使用 UpdateDialog 靈活配置
void checkWithFlexibleDialog() {final updateInfo = UpdateInfo(version: '1.2.0',downloadUrl: 'https://example.com/app.apk',description: '? 修復重要安全漏洞\n? 優化啟動速度\n? 新增夜間模式',fileSize: 25 * 1024 * 1024, // 25MB);showDialog<bool>(context: context,barrierDismissible: !updateInfo.isForceUpdate,builder: (context) => UpdateDialog(updateInfo: updateInfo,// 自定義標題title: Container(padding: const EdgeInsets.all(16),decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.blue, Colors.purple],),),child: Row(children: [Icon(Icons.system_update, color: Colors.white),const SizedBox(width: 8),Text('重要更新 V${updateInfo.version}',style: const TextStyle(color: Colors.white,fontWeight: FontWeight.bold,),),],),),// 自定義內容content: Column(mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.start,children: [Container(padding: const EdgeInsets.all(16),child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Text('更新內容',style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold,),),const SizedBox(height: 8),Text(updateInfo.description),const SizedBox(height: 12),if (updateInfo.fileSize != null)Container(padding: const EdgeInsets.symmetric(horizontal: 12,vertical: 6,),decoration: BoxDecoration(color: Colors.grey.shade100,borderRadius: BorderRadius.circular(16),),child: Text('安裝包大小: ${(updateInfo.fileSize! / 1024 / 1024).toStringAsFixed(1)}MB',style: Theme.of(context).textTheme.bodySmall,),),],),),],),// 自定義底部操作欄footer: Container(padding: const EdgeInsets.all(16),child: Row(children: [if (!updateInfo.isForceUpdate) ...[Expanded(child: OutlinedButton(onPressed: () => Navigator.pop(context, false),child: const Text('稍后提醒'),),),const SizedBox(width: 12),],Expanded(flex: updateInfo.isForceUpdate ? 1 : 1,child: ElevatedButton.icon(onPressed: () => Navigator.pop(context, true),icon: const Icon(Icons.download),label: const Text('立即更新'),),),],),),),);
}

5. 純下載功能

void downloadOnly() {final updateInfo = UpdateInfo(version: '1.1.0',downloadUrl: 'https://example.com/app.apk',description: '更新包',);Updater.download(updateInfo).listen((progress) {if (progress.isCompleted && progress.filePath != null) {print('下載完成: ${progress.filePath}');// 稍后安裝Updater.installApk(progress.filePath!,onSuccess: () => print('安裝成功'),onError: (error) => print('安裝失敗: $error'),);} else if (progress.isFailed) {print('下載失敗: ${progress.error}');}});
}

6. 版本比較

void checkVersionUpdate() {final currentVersion = '1.0.0';final newVersion = '1.1.0';final needUpdate = Updater.needUpdate(currentVersion, newVersion);print('是否需要更新: $needUpdate');
}

📚 API 文檔

UpdateInfo 類

更新信息配置類:

class UpdateInfo {final String version;           // 新版本號 (必需)final String? downloadUrl;      // Android APK下載鏈接final String? iosUrl;          // iOS App Store鏈接final String description;       // 更新說明 (必需)final bool isForceUpdate;      // 是否強制更新final String? fileHash;        // 文件哈希值 (可選)final String? hashAlgorithm;   // 哈希算法 (默認: 'md5')final int? fileSize;           // 文件大小 (字節)final Map<String, dynamic>? extra; // 額外數據
}

Updater 類

主要更新器類:

靜態方法
  • checkAndUpdate() - 檢查并更新應用
  • download() - 純下載方法(不自動安裝)
  • installApk() - 安裝APK文件
  • needUpdate() - 版本比較
  • cancelDownload() - 取消下載
  • dispose() - 清理資源

DownloadProgress 類

下載進度信息:

class DownloadProgress {final int downloaded;          // 已下載字節數final int total;              // 總字節數final double progress;        // 進度 (0.0 - 1.0)final DownloadStatus status;  // 下載狀態final String? error;          // 錯誤信息final String? filePath;       // 文件路徑
}

DownloadStatus 枚舉

enum DownloadStatus {idle,         // 空閑downloading,  // 下載中paused,       // 暫停completed,    // 完成failed,       // 失敗cancelled,    // 取消installing    // 安裝中
}

🔧 高級功能

文件校驗

插件支持MD5文件完整性校驗:

final updateInfo = UpdateInfo(version: '1.1.0',downloadUrl: 'https://example.com/app.apk',description: '安全更新',fileHash: 'a1b2c3d4e5f6...',hashAlgorithm: 'md5',
);

權限處理

插件自動處理以下權限:

  1. 存儲權限 (Android 9及以下)
  2. 安裝權限 (Android 8+)
  3. 網絡權限

對于缺失權限,插件會:

  • 自動請求權限
  • 引導用戶到系統設置頁面
  • 監聽應用生命周期自動重試

生命周期管理

插件智能處理應用前后臺切換:

  • 用戶跳轉權限設置后返回應用時自動重試安裝
  • 后臺下載任務保持活躍
  • 應用退出時自動清理資源

💡 錯誤處理

插件提供完善的錯誤處理機制:

Updater.checkAndUpdate(context,updateInfo,onProgress: (progress) {if (progress.isFailed) {// 處理下載失敗showDialog(context: context,builder: (_) => AlertDialog(title: const Text('下載失敗'),content: Text(progress.error ?? '未知錯誤'),actions: [TextButton(onPressed: () => Navigator.pop(context),child: const Text('確定'),),],),);}},
);

🚦 最佳實踐

  1. 版本檢查: 建議在應用啟動時檢查更新
  2. 網絡判斷: 在檢查更新前判斷網絡狀態
  3. 用戶體驗: 避免在關鍵操作時彈出更新提示
  4. 資源清理: 應用退出時調用 Updater.dispose()
  5. 錯誤日志: 記錄更新過程中的錯誤信息用于調試

? 常見問題

Q: Android安裝失敗怎么辦?

A: 檢查是否授予了"安裝未知應用"權限,插件會自動引導用戶設置。

Q: 下載速度慢怎么辦?

A: 插件使用Android系統下載管理器和HTTP備用方案,確保最佳下載體驗。

Q: 如何支持增量更新?

A: 當前版本不支持增量更新,建議使用文件校驗確保完整性。

Q: iOS如何實現自動更新?

A: iOS由于系統限制只能跳轉App Store,無法實現APK式的自動更新。

?? 注意事項

  1. Android權限

    • Android 6.0+ 需要運行時申請存儲權限
    • Android 8.0+ 需要安裝未知來源應用權限
    • Android 10+ 使用作用域存儲,無需存儲權限
  2. 文件安全

    • 建議使用HTTPS下載鏈接
    • 強烈推薦設置fileHash進行文件完整性校驗
    • 下載的APK文件會自動進行基礎驗證
  3. 用戶體驗

    • 避免在用戶進行重要操作時彈出更新提示
    • 強制更新應謹慎使用,僅在安全更新時使用
    • 提供清晰的更新說明和文件大小信息

📄 許可證

MIT License

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker 1分鐘 快速搭建 redis 哨兵集群

使用 docker-compose 1 分鐘搭建好 1主2從3哨兵的 redis 哨兵集群 目錄結構 redis-sentinel-cluster ├── check_redis.sh ├── docker-compose.yml ├── redis │ └── redis.conf ├── sentinel │ └── sentinel.confdocker-compose.yml 配置 version: 3…

Git與DevOps實戰:從版本控制到自動化部署

一、版本控制1.什么是版本控制&#xff1f;版本控制用于高效追蹤和管理項目開發中的代碼、配置及文檔變更歷史&#xff0c;確保團隊成員始終使用正確版本&#xff0c;并支持版本回溯、差異比較和文件恢復。它能帶來以下優勢&#xff1a;通過歷史記錄保障數據安全與完整性&#…

大模型——利用RAG構建智能問答平臺實戰

利用RAG構建智能問答平臺實戰 目前公司的智能問答平臺利用RAG技術構建,現給大家分享下通RAG技術構建智能問平臺的具體流程和原理。 一、什么是RAG RAG是檢索增強生成技術(Retrieval-Augmented Generation),目前是構建智能問答的重要技術。RAG相比傳統的檢索可以可以減少…

flume事務機制詳解:保障數據可靠性的核心邏輯

flume事務機制詳解&#xff1a;保障數據可靠性的核心邏輯 在數據采集過程中&#xff0c;“不丟數據、不重數據” 是核心需求。Flume 之所以能在分布式環境下保證數據可靠性&#xff0c;關鍵在于其內置的事務機制。Flume 通過在 “Source → Channel” 和 “Channel → Sink” …

第四十九天(springboot模版注入ThymeleafFreemarkerVelocity)

開發框架-SpringBoot 參考&#xff1a;Spring Boot 中文文檔 新建一個spring Boot 項目&#xff0c;修改服務器url為 aliyun.com 不然沒有與jdk8版本對應的java 選擇一個spring web 庫&#xff0c;點擊創建即可 來到這個頁面點擊運行 啟動的是8080端口&#xff0c;用127.0.0.1…

Spring MVC 九大組件源碼深度剖析(六):HandlerExceptionResolver - 異常處理的藝術

文章目錄一、異常處理的核心價值二、核心接口設計三、四大內置實現類源碼解析1. ExceptionHandlerExceptionResolver&#xff08;現代異常處理核心&#xff09;2. ResponseStatusExceptionResolver&#xff08;HTTP狀態碼處理&#xff09;3. DefaultHandlerExceptionResolver&a…

MCP(Model Context Protocol,模型上下文協議)介紹

1. 背景 隨著大語言模型&#xff08;LLM, Large Language Model&#xff09;的應用越來越廣泛&#xff0c;一個核心問題逐漸凸顯&#xff1a; 模型在對話或推理時&#xff0c;往往只能依賴有限上下文窗口。外部工具、知識庫、應用接口如何統一接入模型&#xff0c;缺乏標準協議…

synchronized的鎖對象 和 wait,notify的調用者之間的關系

誰調用了wait和notify方法&#xff0c;會決定這兩個方法的控制范圍嗎&#xff1f;你的問題非常深入&#xff0c;涉及到 wait() 和 notify() 方法的控制范圍和作用域。讓我們詳細分析一下&#xff1a;? 核心概念&#xff1a;控制范圍由“鎖對象”決定wait() 和 notify() 的控制…

【技術教程】如何將文檔編輯器集成到用 .Net 編寫的網絡應用程序中

在現代網絡應用中&#xff0c;?富文本編輯能力已成為內容管理系統的核心需求。對于 .NET 開發者而言&#xff0c;選擇適合的編輯器并高效集成&#xff0c;是構建企業級應用的關鍵一步&#xff0c;可讓項目管理、 CRM 或定制化系統具備原生辦公能力&#xff0c;消除頻繁切換應用…

【大模型記憶-Mem0詳解-1】概述

目的和能力 Mem0 通過提供以下功能將無狀態 AI 應用程序轉換為有狀態、支持內存的系統&#xff1a; 持久記憶 &#xff1a;跨會話長期保留用戶偏好、對話歷史記錄和上下文信息多級內存 &#xff1a;支持具有自適應個性化的用戶級、會話級和代理級內存智能提取 &#xff1a;基于…

2024年山東省信息學小學組(CSP-X)第一輪題解

2024年山東省信息學小學組(CSP-X)第一輪題解 原題下載 單項選擇題 閱讀程序 閱讀程序 #1 判斷題 閱讀程序 #2 判斷題 單選題 閱讀程序 #3 判斷題 單選題 完善程序 消滅怪獸 位運算操作 原題下載 CSP-X2024小學組(山東)第一輪試題以及答案 單項選擇題 共 15 題,每題 2 分…

SW - 用裝配圖的方式組合多個子零件然后轉換成為零件,可維護性好

文章目錄SW - 用裝配圖的方式組合多個子零件然后轉換成為零件&#xff0c;可維護性好概述筆記例子將裝配圖另存為零件將零件圖中的多個實體組合為一個實體的特征備注ENDSW - 用裝配圖的方式組合多個子零件然后轉換成為零件&#xff0c;可維護性好 概述 以前畫機械零件&#x…

PhotoshopImageGenerator:基于Photoshop的自動化圖像數據集生成工具

整體邏輯與設計思路 PhotoshopImageGenerator是一個基于Python和Win32COM的自動化工具,通過控制Adobe Photoshop CC 2019創建多樣化的圖像數據集。其核心設計思路是通過程序化調用Photoshop的圖像編輯能力,為基礎圖像添加隨機元素(圖片、文本、形狀)和效果,快速生成大量變…

macos自動安裝emsdk4.0.13腳本

1.替換文件 emsdk #!/bin/sh # Copyright 2019 The Emscripten Authors. All rights reserved. # Emscripten is available under two separate licenses, the MIT license and the # University of Illinois/NCSA Open Source License. Both these licenses can be # foun…

c++ Effective c++ 條款5

class MyClass { public:MyClass(int& ref, const int c_val) : myRef(ref), myConstVal(c_val) {}// 明確刪除拷貝操作MyClass(const MyClass&) delete;MyClass& operator(const MyClass&) delete;private:int& myRef; // 引用成員const int myCo…

如何使用 Xshell 8 連接到一臺 CentOS 7 電腦(服務器)

什么是 Xshell&#xff1f; Xshell 是一款功能強大的、適用于 Windows 平臺的終端模擬器。它支持 SSH (Secure Shell)、SFTP、TELNET、RLOGIN 和 SERIAL 等多種網絡協議&#xff0c;讓用戶能夠安全地連接和管理遠程服務器。 對于開發者、系統管理員和網絡工程師來說&#xff…

CSS scale函數詳解

目錄 基本語法 核心特性 常用場景示例 1. 等比例縮放&#xff08;X 軸和 Y 軸相同&#xff09; 2. 非等比例縮放&#xff08;X 軸和 Y 軸不同&#xff09; 3. 翻轉并縮放 4. 配合過渡動畫實現交互效果 5. 圖片懸停縮放效果 6. 縮放原點調整 與其他變換組合使用 注意…

【MATLAB代碼】基于EKF的二維組合導航仿真代碼,狀態量為位置、速度、航向角與IMU偏置,觀測量為XY軸的位置和速度,附完整代碼

8維狀態量(2維位置、2維速度、航向角、航向角偏置、2維加速度計偏置)+4維觀測量(2維位置、2維速度)。 訂閱專欄后,可直接查看源代碼,粘貼到MATLAB空腳本中即可直接運行、得到結果 文章目錄 運行結果 MATLAB源代碼 程序詳解 ?? 程序概述 狀態預測(狀態轉移函數) 狀態雅…

OpenCV 圖像輪廓檢測

目錄 一、輪廓檢測基礎概念 二、核心 API 詳解&#xff1a;cv2.findContours () 參數說明&#xff1a; 返回值說明&#xff1a; 三、輪廓檢測實戰步驟 1. 圖像預處理&#xff08;灰度化與二值化&#xff09; 2. 查找輪廓 3. 繪制輪廓 四、輪廓的常用屬性與操作 1. 輪…

【圖論】 Graph.jl 概覽

文章目錄安裝基礎使用基本操作全局圖的指標頂點性質邊性質讀寫圖按照 .lgz 格式存儲圖數據&#xff08;壓縮格式&#xff09;按照 .lg 格式存儲圖數據&#xff08;非壓縮格式&#xff09;圖的繪制TikzGraphs.jl Latex 論文風格GraphPlot.jl 通常與 Compose.jl 一起使用SGtSNEpi…