news 2026/3/29 13:07:27

使用flutter_xupdate 更新 flutter app版本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用flutter_xupdate 更新 flutter app版本

flutter_update 使用说明

说明: flutter_update 基于 GitHub - xuexiangjys/flutter_xupdate: A Flutter plugin for XUpdate(Android Version Update Library) 升级而来 ,(pub 版本 flutter_xupdate - Dart API docs (pub.dev))。

本地环境flutter 3.24.5 dart 3.5.4

使用说明: 参考 flutter_xupdate 一键实现Flutter应用版本更新的插件 - 知乎 (zhihu.com)

1.集成示例:

1.通过git远程集成(不建议):

flutter_update: git: url: "https://gitee.com/zhu-xianjun-123/flutter_xupdate.git"

2.本地集成(推荐) 克隆项目至本地,新建packages目录,放入到文件夹中

flutter_update: path: "./packages/flutter_xupdate"

2.flutter 代码 (生产环境)

使用GetService 全局任务

class AuthService extends GetxService { final Rx<bool> _login = false.obs; ​ get login => _login.value; Dio? dio; final update_json = "https://gitee.com/zhu-xianjun-123/music/raw/master/json/update_custom.json"; ​ @override void onInit() async { super.onInit(); dio = Dio(); final result = await dio?.get(update_json); UpdateEntity updateEntity = UpdateEntity.fromJson(result!.data); final info = await PackageInfo.fromPlatform(); final current_version = Version(info.version); final update_version = Version(updateEntity.versionName!); if(update_version >current_version ) { FlutterXUpdate.updateByInfo(updateEntity:updateEntity); } } ​ Future<AuthService> initLoginState() async { ///阻塞判断接口状态 正常应该是请求 如果不成功则刷新 await Future.delayed(const Duration(milliseconds: 1500)); String? token = HiveService.get("token"); ​ if (Validators.isNotNullOrEmpty(token)) { _login.value = true; } else { _login.value = false; } ​ return this; } ​ void changeLoginStatus(bool status) { _login.value = status; } ​ void setLoginState(bool status) { _login.value = status; } ​ @override void onClose() { super.onClose(); Log.i("onClose ~~~~~"); dio?.close(); } }

在mian.dart 初始化

Future<void> _initializeApp() async { WidgetsFlutterBinding.ensureInitialized(); Log().init(); ApiClient().init(); //在检测更新前初始化逻辑 initXUpdate(); await HiveService.init(); await Get.putAsync(() => AuthService().initLoginState()); } ​ void initXUpdate() { if (Platform.isAndroid) { FlutterXUpdate.init( ​ ///是否输出日志 debug: true, ​ ///是否使用post请求 isPost: false, ​ ///post请求是否是上传json isPostJson: false, ​ ///请求响应超时时间 timeout: 25000, ​ ///是否开启自动模式 isWifiOnly: false, ​ ///是否开启自动模式 isAutoMode: false, ​ ///需要设置的公共参数 supportSilentInstall: false, ​ ///在下载过程中,如果点击了取消的话,是否弹出切换下载方式的重试提示弹窗 enableRetry: false) .then((value) { Log.i(value.toString()); }).catchError((error) { Log.e(error.toString()); }); } }

3.flutter 代码

全部使用示例,使用getx

2.1 controller层

import 'dart:async'; import 'dart:io'; ​ import 'package:flutter_update/flutter_xupdate.dart'; import 'package:get/get.dart'; ​ import '../../../models/app_info.dart'; import '../../../utils/log.dart'; ​ class UpdateExampleController extends GetxController { Rx<String> _message = Rx(''); Rx<AppInfo?> app_info = Rx(null); //json 示例 推荐使用 final String _updateUrl = 'https://gitee.com/xuexiangjys/XUpdate/raw/master/jsonapi/update_test.json'; ​ final String _updateUrl2 = 'https://gitee.com/xuexiangjys/XUpdate/raw/master/jsonapi/update_forced.json'; ​ final String _updateUrl3 = 'https://gitee.com/xuexiangjys/XUpdate/raw/master/jsonapi/update_custom.json'; ​ @override void onInit() { super.onInit(); initXUpdate(); } ​ ​ ​ ///默认App更新 void checkUpdateDefault() { FlutterXUpdate.checkUpdate(url: _updateUrl); } ​ ///默认App更新 + 支持后台更新 void checkUpdateSupportBackground() { FlutterXUpdate.checkUpdate(url: _updateUrl, supportBackgroundUpdate: true); } ​ ///调整宽高比 void checkUpdateRatio() { FlutterXUpdate.checkUpdate(url: _updateUrl, widthRatio: 0.6); } ​ ///强制更新 void checkUpdateForce() { FlutterXUpdate.checkUpdate(url: _updateUrl2); } ​ ///自动模式, 如果需要完全无人干预,自动更新,需要root权限【静默安装需要】 void checkUpdateAutoMode() { FlutterXUpdate.checkUpdate(url: _updateUrl, isAutoMode: true); } ​ ///下载时点击取消允许切换下载方式 void enableChangeDownLoadType() { FlutterXUpdate.checkUpdate( url: _updateUrl, overrideGlobalRetryStrategy: true, enableRetry: true, retryContent: "Github下载速度太慢了,是否考虑切换蒲公英下载?", retryUrl: "https://www.pgyer.com/flutter_learn"); } ​ ///显示重试提示弹窗 void showRetryDialogTip() { FlutterXUpdate.showRetryUpdateTipDialog( // retryContent: "Github下载速度太慢了,是否考虑切换蒲公英下载?", retryUrl: "https://www.pgyer.com/flutter_learn"); } ​ ///使用自定义json解析 void customJsonParse() { FlutterXUpdate.checkUpdate(url: _updateUrl3, isCustomParse: true); } ​ ///直接传入UpdateEntity进行更新提示 void checkUpdateByUpdateEntity() { UpdateEntity updateEntity = UpdateEntity( hasUpdate: true, isForce: false, isIgnorable: false, versionCode: 3, versionName: "1.0.2", updateContent: "\r\n1、优化api接口。\r\n2、添加使用demo演示。\r\n3、新增自定义更新服务API接口。\r\n4、优化更新提示界面。", downloadUrl: "https://xuexiangjys.oss-cn-shanghai.aliyuncs.com/apk/xupdate_demo_1.0.2.apk", apkSize: 2048); FlutterXUpdate.updateByInfo(updateEntity:updateEntity); } ​ ///自定义更新弹窗样式 void customPromptDialog() { FlutterXUpdate.checkUpdate( url: _updateUrl, themeColor: '#FFFFAC5D', topImageRes: 'bg_update_top', buttonTextColor: '#FFFFFFFF'); } ​ ///定时执行任务 void timerUpdateTask() { Timer.periodic(const Duration(seconds: 5), (timer) { checkUpdateDefault(); }); } ​ void initXUpdate() { if (Platform.isAndroid) { FlutterXUpdate.init( ​ ///是否输出日志 debug: true, ​ ///是否使用post请求 isPost: false, ​ ///post请求是否是上传json isPostJson: false, ​ ///请求响应超时时间 timeout: 25000, ​ ///是否开启自动模式 isWifiOnly: false, ​ ///是否开启自动模式 isAutoMode: false, ​ ///需要设置的公共参数 supportSilentInstall: false, ​ ///在下载过程中,如果点击了取消的话,是否弹出切换下载方式的重试提示弹窗 enableRetry: false) .then((value) { _message.value = value?["message"]; }).catchError((error) { Log.e(error.toString()); }); } } } ​

全部示例:

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:music/pages/demo/update_example/update_example_controller.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; ​ import '../../../utils/adapt.dart'; ​ class UpdateExampleView extends GetView<UpdateExampleController> { const UpdateExampleView({super.key}); ​ @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("升级更细示例")), body: Container( width: Adapt.screenW(), child: Padding(padding: EdgeInsets.symmetric(horizontal: 20.w ), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ TDButton( width: double.infinity, text: "直接传入UpdateEntity进行更新", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.checkUpdateByUpdateEntity, ), SizedBox(height: 20.h), TDButton( width: double.infinity, text: "默认App更新", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.checkUpdateDefault, ), SizedBox(height: 20.h), TDButton( width: double.infinity, text: "默认App更新 + 支持后台更新", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.checkUpdateSupportBackground, ), SizedBox(height: 20.h), ​ TDButton( width: double.infinity, text: "强制更新", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.checkUpdateForce, ), SizedBox(height: 20.h), TDButton( width: double.infinity, text: "下载失败后重试", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.showRetryDialogTip, ), ​ TDButton( width: double.infinity, text: "延迟更新", theme: TDButtonTheme.primary, size: TDButtonSize.large, onTap: controller.timerUpdateTask, ), ], )) ) ); } } ​

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 2:43:21

智慧城市监控系统融合GLM-4.6V-Flash-WEB实现语义级报警

智慧城市监控系统融合GLM-4.6V-Flash-WEB实现语义级报警 在城市安防的演进历程中&#xff0c;我们早已走过了“看得见”的阶段。如今的问题不再是“有没有摄像头”&#xff0c;而是“能不能理解画面里到底发生了什么”。一个典型的场景是&#xff1a;深夜小区围栏边闪过一道人影…

作者头像 李华
网站建设 2026/3/21 11:33:48

ESP32传感器全攻略:IMU、超声波、红外,让你的智能设备“耳聪目明“

三大传感器,三种感知能力,三种改变世界的可能 从姿态检测到距离测量,从障碍物避让到智能控制 5000字深度解析,让你成为ESP32传感器专家 前言:为什么传感器是ESP32的灵魂? 你是否曾想过,让你的智能设备能够"感知"世界?就像人类有眼睛、耳朵和皮肤一样…

作者头像 李华
网站建设 2026/3/15 18:41:01

​我今年30岁,无房无贷孑然一身。出生在95年的沿海小镇(隶属八山一水一分田的省份),我四岁那年父母终于如愿以偿地迎来了弟弟,从此以后弟弟就是家里的中心。高考填报自愿的时候,想到远点的地方1

我今年30岁&#xff0c;无房无贷孑然一身。出生在95年的沿海小镇&#xff08;隶属八山一水一分田的省份&#xff09;&#xff0c;我四岁那年父母终于如愿以偿地迎来了弟弟&#xff0c;从此以后弟弟就是家里的中心。高考填报自愿的时候&#xff0c;想到远点的地方上大学&#xf…

作者头像 李华
网站建设 2026/3/26 20:54:49

虚假新闻配图识别:GLM-4.6V-Flash-WEB验证图像与文本一致性

虚假新闻配图识别&#xff1a;GLM-4.6V-Flash-WEB验证图像与文本一致性 在社交媒体和资讯平台每天处理数亿条内容的今天&#xff0c;一条配有“现场图”的谣言可能在几分钟内引爆舆论。更棘手的是&#xff0c;这些图片往往并非凭空生成——它们真实存在&#xff0c;只是被刻意错…

作者头像 李华
网站建设 2026/3/25 14:36:47

基于SpringBoot+Vue的人力资源管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一款基于SpringBootVue的人力资源管理系统&#xff0c;解决企业人力资源管理中员工信息管理分散、招聘流程繁琐、考勤统计低效、绩效评估不规范及薪酬核算复杂等问题。系统采用前后端分离架构&#xff0c;后端以SpringBoot为核心开发框架构建高效稳…

作者头像 李华
网站建设 2026/3/26 21:50:49

煤矿安全监控系统集成GLM-4.6V-Flash-WEB识别违规操作

煤矿安全监控系统集成GLM-4.6V-Flash-WEB识别违规操作 在煤矿井下幽深的巷道中&#xff0c;一顶未佩戴的安全帽、一次未经授权的区域闯入、一条仍在运转却无人值守的皮带输送机——这些看似微小的疏忽&#xff0c;往往可能演变为重大安全事故。传统视频监控系统虽然记录了全过程…

作者头像 李华