Flutter应用升级管理插件upgrade_util的使用
Flutter应用升级管理插件upgrade_util的使用
目前,该插件仅支持Android和iOS。
第三方库的使用
- 使用
dio
下载apk文件,此功能已经内置在插件中,无需单独引用。
准备工作
版本约束
sdk: ">=3.1.0 <4.0.0"
flutter: ">=3.13.0"
依赖项
- 在
pubspec.yaml
文件中添加upgrade_util
依赖。
dependencies:
upgrade_util: ^latest_version
- 执行
flutter pub get
命令获取包。
flutter pub get
- 引入
upgrade_util
库。
import 'package:upgrade_util/upgrade_util.dart';
本地化配置
在MaterialApp
中添加本地化配置。
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
...
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
...
UpgradeLocalizationsDelegate.delegate,
],
...
);
}
}
使用方法
showUpgradeDialog
通过调用showUpgradeDialog
来弹出更新对话框。
参数名 | 类型 | 描述 | 默认值 |
---|---|---|---|
context | BuildContext | 上下文 | 必填 |
key | Key? | 组件标识符 | null |
upgradeConfig | UpgradeConfig? | 对话框样式 | 默认值 |
iOSUpgradeConfig | IosUpgradeConfig? | iOS升级配置 | 默认值 |
androidUpgradeConfig | AndroidUpgradeConfig? | Android升级配置 | 默认值 |
isDebugLog | bool | 是否打印日志 | false |
barrierLabel | String? | 遮罩层标签 | null |
arguments | Object? | 路由传递的参数 | null |
UpgradeConfig
参数名 | 类型 | 描述 | 默认值 |
---|---|---|---|
force | bool | 是否强制更新 | false |
titleWidget | Widget? | 标题布局 | null |
title | String? | 版本标题 | 默认值 |
titleTextStyle | TextStyle? | 标题文本样式 | null |
titleStrutStyle | StrutStyle? | 标题字距样式 | null |
contentWidget | Widget? | 内容布局 | null |
content | String? | 版本描述 | null |
contentTextStyle | TextStyle? | 内容文本样式 | null |
contentStrutStyle | StrutStyle? | 内容字距样式 | null |
updateText | String? | 更新按钮文本 | 默认值 |
updateTextStyle | TextStyle? | 更新按钮文本样式 | null |
cancelText | String? | 取消按钮文本 | 默认值 |
cancelTextStyle | TextStyle? | 取消按钮文本样式 | null |
IosUpgradeConfig
参数名 | 类型 | 描述 | 默认值 |
---|---|---|---|
appleId | String? | Apple ID | null |
scrollController | ScrollController? | 控制内容滚动的控制器 | null |
actionScrollController | ScrollController? | 控制操作按钮滚动的控制器 | null |
isUpgradeDefaultAction | bool | 是否为默认选择 | false |
isUpgradeDestructiveAction | bool | 是否破坏对象 | false |
isCancelDefaultAction | bool | 是否为默认选择 | false |
isCancelDestructiveAction | bool | 是否破坏对象 | true |
AndroidUpgradeConfig
参数名 | 类型 | 描述 | 默认值 |
---|---|---|---|
androidMarket | AndroidMarket? | 应用市场设置 | 默认值 |
otherMarkets | List<String> | 应用市场包名 | [] |
dialogBorderRadius | BorderRadius? | 对话框圆角半径 | 默认值 |
topImageProvider | ImageProvider? | 对话框顶部图片 | null |
topImageHeight | double? | 图片高度 | null |
updateButton | Widget? Function | 更新按钮 | null |
updateButtonStyle | ButtonStyle? | 更新按钮样式 | null |
downloadCancelText | String? | 下载取消文本 | 默认值 |
downloadUri | Uri? | APK下载链接 | null |
saveName | String? | 下载完成后的文件名 | temp.apk |
downloadInterceptors | List<Interceptor> | 添加到[Dio]的拦截器 | [] |
deleteOnError | bool | 发生错误时是否删除文件 | true |
lengthHeader | String | 文件原始大小(未压缩) | Headers.contentLengthHeader |
data | dynamic | 请求数据 | null |
options | Options? | 每个请求可以传递一个[Options]对象 | null |
isExistsFile | bool | 验证文件是否存在 | false |
indicatorHeight | double? | 指示器高度 | 10px |
indicatorBackgroundColor | Color? | 线性进度指示器背景色 | null |
indicatorColor | Color? | 线性进度指示器颜色 | null |
indicatorValueColor | Color? | 线性进度指示器值颜色 | null |
indicatorTextSize | double? | 指示器文本大小 | 8px |
indicatorTextColor | Color? | 指示器文本颜色 | null |
onDownloadProgressCallback | DownloadProgressCallback? | 实现下载进度监听事件 | null |
onDownloadStatusCallback | DownloadStatusCallback? | 实现下载状态监听事件 | null |
方法
要跳转到App Store或应用市场,使用jumpToStore
方法。
-
必须的项是
jumpMode
,目前有三种模式;JumpMode.detailPage
,跳转到应用详情页面(即产品介绍页面);JumpMode.reviewsPage
,跳转到应用评论页面;JumpMode.writeReview
,跳转到应用评论页面并评论。
-
对于iOS,
appleId
是必需的,这是App Store的应用编号; -
对于Android,
marketPackageName
是跳转到的应用市场的包名,不是必需的; -
字段
packageName
不再提供,因为项目统一使用包名。
Android特有的方法
getDownloadPath
,获取软件下载保存路径;installApk
,安装APK,并跳转到安装引导页;getMarkets
,获取手机内包含的应用市场列表。
示例代码
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:upgrade_util/upgrade_util.dart';
void main() {
runApp(const MyApp());
}
/// 程序入口
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(useMaterial3: true),
// locale: const Locale('zh', 'CN'),
// locale: const Locale('en', 'US'),
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
UpgradeLocalizationsDelegate.delegate,
],
supportedLocales: const <Locale>[Locale('en', 'US'), Locale('zh', 'CN')],
home: const HomePage(),
debugShowCheckedModeBanner: false,
);
}
}
/// 主页
class HomePage extends StatefulWidget {
const HomePage({super.key});
[@override](/user/override)
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final List<String> list = [
'Android Test: Get the download of apk',
'Android Test: Get Available Market',
'Jump To AppStore Reviews Page',
'Jump To AppStore and Write Review',
'Jump To Detail Page',
'Upgrade Dialog',
];
/// 微信应用商店编号
final String wechatAppleID = '414478124';
/// 微信包名
final String wechatPackageName = 'com.tencent.mm';
[@override](/user/override)
Widget build(BuildContext context) => _platformWidget();
Widget _platformWidget() {
Widget child = Center(
child: Text('不支持【 ${operatingSystem} 】平台'),
);
if (defaultTargetPlatform == TargetPlatform.iOS ||
defaultTargetPlatform == TargetPlatform.android) {
child = _buildBodyWidget();
}
return Scaffold(
appBar: AppBar(title: const Text('App升级示例')),
body: child,
);
}
Widget _buildBodyWidget() {
return ListView.builder(
itemBuilder: (BuildContext context, int index) {
final ElevatedButton child = ElevatedButton(
onPressed: () async => onPressed(index),
child: Text(list[index]),
);
return Container(
margin: const EdgeInsets.only(top: 10),
padding: const EdgeInsets.symmetric(horizontal: 15),
child: child,
);
},
itemCount: list.length,
);
}
Future<void> onPressed(int index) async {
switch (index) {
case 0:
final String result = await UpgradeUtil.getDownloadPath();
debugPrint(result);
break;
case 1:
// 获取手机内的所有应用市场列表
final List<AndroidMarketModel> marketPackages =
await UpgradeUtil.getMarkets(AndroidMarket.allTrue.toMarkets());
debugPrint(marketPackages.toString());
break;
case 2:
// 跳转到AppStore评论页面,这里以微信为例
await UpgradeUtil.jumpToStore(
jumpMode: JumpMode.reviewsPage,
appleId: wechatAppleID,
);
break;
case 3:
// 跳转到AppStore并评论,这里以微信为例
await UpgradeUtil.jumpToStore(
jumpMode: JumpMode.writeReview,
appleId: wechatAppleID,
);
break;
case 4:
// 跳转到详情页面,这里以微信为例
await UpgradeUtil.jumpToStore(
jumpMode: JumpMode.detailPage,
appleId: wechatAppleID,
);
break;
case 5:
// 显示更新对话框,这里以微信为例
await showUpgradeDialog<void>(
context,
upgradeConfig: UpgradeConfig(
title: '发现新版本V8.8.8.414174360',
content: '1.修复已知Bug\n2.优化软件性能,提升用户体验效果\n3.更多新功能等待您的探索',
),
iOSUpgradeConfig: IosUpgradeConfig(appleId: wechatAppleID),
androidUpgradeConfig: AndroidUpgradeConfig(androidMarket: AndroidMarket.allTrue),
);
break;
default:
break;
}
}
/// 操作系统描述
static String get operatingSystem {
if (Platform.isAndroid) {
return 'Android';
} else if (Platform.isIOS) {
return 'iOS';
} else if (Platform.isWindows) {
return 'Windows';
} else if (Platform.isMacOS) {
return 'macOS';
} else if (Platform.isLinux) {
return 'Linux';
} else if (Platform.isFuchsia) {
return 'Fuchsia OS';
} else if (kIsWeb) {
return 'Web';
}
return '';
}
}
更多关于Flutter应用升级管理插件upgrade_util的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter应用升级管理插件upgrade_util的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用upgrade_util
插件来进行应用升级管理的示例代码。upgrade_util
是一个用于管理应用版本更新的Flutter插件,它可以帮助开发者实现应用的版本检查和升级提示功能。
首先,确保你已经在pubspec.yaml
文件中添加了upgrade_util
依赖:
dependencies:
flutter:
sdk: flutter
upgrade_util: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter应用中,你可以按照以下步骤来使用upgrade_util
插件:
- 导入插件:
在你的Dart文件中导入upgrade_util
插件:
import 'package:upgrade_util/upgrade_util.dart';
- 配置升级信息:
你需要配置应用的当前版本信息和升级信息。这通常是通过从服务器获取JSON数据来实现的,但在这个示例中,我们将使用硬编码的数据。
Map<String, dynamic> upgradeInfo = {
"current_version": "1.0.0", // 当前应用版本
"latest_version": "1.0.1", // 最新版本
"upgrade_url": "https://example.com/yourapp-1.0.1.apk", // 最新版本下载地址
"upgrade_content": "修复了一些已知问题并优化了性能。", // 升级说明
"mandatory": false, // 是否强制升级
};
- 检查版本并显示升级提示:
使用UpgradeUtil
类来检查版本并显示升级提示。以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:upgrade_util/upgrade_util.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
_checkAppVersion();
}
void _checkAppVersion() async {
Map<String, dynamic> upgradeInfo = {
"current_version": "1.0.0",
"latest_version": "1.0.1",
"upgrade_url": "https://example.com/yourapp-1.0.1.apk",
"upgrade_content": "修复了一些已知问题并优化了性能。",
"mandatory": false,
};
UpgradeUtil().init(
context: context,
currentVersion: upgradeInfo['current_version'],
upgradeInfo: upgradeInfo,
onUpgrade: () async {
// 用户点击了升级按钮后的处理逻辑
// 这里可以启动下载或跳转到应用商店等
},
onIgnore: () {
// 用户点击了忽略按钮后的处理逻辑
},
onLater: () {
// 用户点击了稍后再升级按钮后的处理逻辑
},
);
UpgradeUtil().checkVersion();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo'),
),
body: Center(
child: Text('Hello, Flutter!'),
),
);
}
}
在这个示例中,_checkAppVersion
方法在initState
中被调用,它会初始化UpgradeUtil
并检查当前版本与最新版本。如果发现有新版本,UpgradeUtil
会自动显示升级提示对话框。
注意:
currentVersion
应该是当前应用的版本号。upgradeInfo
包含了最新版本号、下载地址、升级说明和是否强制升级等信息。onUpgrade
、onIgnore
和onLater
回调分别处理用户点击升级、忽略和稍后再升级按钮的情况。
请根据你的实际需求调整上述代码,特别是升级信息的获取部分,通常这些信息会从服务器获取。