news 2026/5/30 10:32:37

使用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/5/30 6:13:35

微pe官网启动盘安装Ubuntu跑GLM-4.6V-Flash-WEB推理实例

微pe官网启动盘安装Ubuntu跑GLM-4.6V-Flash-WEB推理实例 在客户现场调试AI系统时&#xff0c;你是否遇到过这样的窘境&#xff1a;目标机器硬盘里全是生产数据不敢重装&#xff0c;BIOS设置复杂、驱动不兼容&#xff0c;而演示时间只剩两小时&#xff1f;传统部署方式动辄需要半…

作者头像 李华
网站建设 2026/5/30 6:13:13

基于Springboot就业岗位推荐系统a6nq8o76(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。

一、系统程序文件列表 二、开题报告内容 基于Spring Boot的就业岗位推荐系统开题报告 一、选题背景与意义 选题背景 随着互联网技术的飞速发展和就业市场竞争的日益激烈&#xff0c;求职者面临着信息过载和选择困难的问题。传统的求职方式往往依赖于招聘网站的信息发布和求…

作者头像 李华
网站建设 2026/5/30 6:57:49

远程办公安全审计:GLM-4.6V-Flash-WEB识别敏感屏幕截图

远程办公安全审计&#xff1a;GLM-4.6V-Flash-WEB识别敏感屏幕截图 在远程办公已成为常态的今天&#xff0c;企业数据安全正面临前所未有的挑战。员工通过微信、钉钉、飞书等工具交流工作时&#xff0c;一张随手截取的系统界面图&#xff0c;可能就包含了数据库表结构、客户联系…

作者头像 李华
网站建设 2026/5/24 7:09:34

在线教育平台题库建设:GLM-4.6V-Flash-WEB提取试卷图像题目

在线教育平台题库建设&#xff1a;GLM-4.6V-Flash-WEB提取试卷图像题目 在今天&#xff0c;越来越多的教育机构开始将历史积累的纸质试卷、扫描讲义转化为可检索、可复用的数字题库。然而&#xff0c;这一过程远非“拍照OCR”那么简单。面对复杂的排版、手写批注、数学公式和图…

作者头像 李华
网站建设 2026/5/29 4:43:11

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

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

作者头像 李华
网站建设 2026/5/26 16:42:46

汽车外观改装:GLM-4.6V-Flash-WEB预览轮毂与贴膜效果

汽车外观改装&#xff1a;用GLM-4.6V-Flash-WEB实时预览轮毂与贴膜效果 在汽车后市场&#xff0c;个性化改装早已不再是小众爱好。越来越多车主希望自己的爱车能“一眼辨识”——无论是换上更具运动感的轮毂&#xff0c;还是贴上炫酷的哑光黑或渐变彩虹膜。但问题也随之而来&am…

作者头像 李华