Flutter版本比较插件version_comparator的使用
Flutter版本比较插件version_comparator的使用
简介
VersionComparator
是一个用于在Flutter应用中比较本地版本和商店版本的插件。它支持多个平台(如Google Play、App Store、华为应用市场等),并且提供了丰富的自定义选项,使得开发者可以根据需要灵活地管理版本更新提示。
主要特性
- 多平台支持:支持Android、iOS、华为应用市场以及自定义商店。
- 可定制化:可以自定义错误信息、提示信息、对话框样式等。
- 简单易用:提供简洁的API,方便集成到现有项目中。
- 强大的结构:支持Future操作和Widget两种方式来比较版本。
- 显示对话框或自定义组件:当版本不一致时,可以选择显示AlertDialog或自定义的Widget。
使用方法
1. 导入包
首先,在pubspec.yaml
文件中添加version_comparator
依赖:
dependencies:
version_comparator: ^最新版本号
然后在Dart文件中导入包:
import 'package:version_comparator/version_comparator.dart';
2. 比较版本
2.1 使用Future操作比较版本
你可以通过调用versionCompare()
方法来比较本地版本和商店版本。该方法返回一个DataResult<VersionResponseModel>
对象,其中包含版本比较的结果。
Future<void> compareVersion() async {
// 设置加载状态
_setLoading(true);
// 获取商店和本地版本的结果
final response = await VersionComparator.instance.versionCompare();
// 关闭加载状态
_setLoading(false);
// 显示结果
print(response?.data?.toJson() ?? '-');
}
2.2 使用Widget比较版本
AppVersionComparatorView
是一个封装好的Widget,它可以自动处理版本比较的逻辑,并根据比较结果显示不同的页面。你可以选择使用widget
模式或alertDialog
模式。
- Widget模式:直接在界面上显示版本比较的结果。
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: AppVersionComparatorView.widget(
errorPageBuilder: (context, error) => Center(child: Text(error)),
onCompareSuccess: (data) => debugPrint('Success: ${data.storeVersion}'),
outOfDateVersionPageBuilder: (context, error, data) => _buildOutOfDateWidget(error, data),
child: _buildBody(),
),
);
}
- AlertDialog模式:通过对话框显示版本比较的结果。
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: AppVersionComparatorView.alertDialog(
onCompareSuccess: (data) => debugPrint('Success: ${data.storeVersion}'),
invalidVersionDialogContentBuilder: (context, message) => Text('Error: $message'),
child: _buildBody(),
),
);
}
3. 自定义比较
如果你的应用版本来自非标准商店(如自定义的Web API),你可以使用customCompare
方法来自定义版本比较逻辑。
Future<void> customCompareVersion() async {
_setLoading(true);
final result = await VersionComparator.instance.customCompare(
localVersion: '1.0.0',
store: MyStoreModel(appId: 'YOUR_APP_BUNDLE_ID'),
customUpdateLink: (body) => 'YOU CAN ADD CUSTOM UPDATE LINK',
onConvertVersion: (responseBody) {
final result = MyVersionConvertManager().convert(MyVersionResponseModel.fromResponse(responseBody));
return result.data;
},
);
_setLoading(false);
_setResultMessage(result);
}
4. 显示版本更新对话框
当检测到应用版本过旧时,你可以使用showSimpleVersionDialog
方法来显示一个简单的版本更新对话框。
await VersionComparator.instance.showSimpleVersionDialog(
context,
versionResponseModel,
isUpdateRequired: true,
);
5. 自定义消息
你可以通过继承ComparatorErrorMessage
或ComparatorInfoMessage
类来自定义错误和提示信息。
// 自定义错误消息
class MyCustomErrorMessage extends ComparatorErrorMessage {
[@override](/user/override)
String get appNotFound => '应用未在商店中找到。';
[@override](/user/override)
String get appVersionFetchError => '无法获取应用版本信息。';
}
// 设置自定义错误消息
VersionComparator.instance.setErrorMessages(MyCustomErrorMessage());
// 自定义提示消息
class MyCustomInfoMessage implements ComparatorInfoMessage {
[@override](/user/override)
String get checkVersionErrorDialogTitle => '版本检查错误';
[@override](/user/override)
String get checkVersionLoadingMessage => '正在检查版本...';
}
// 设置自定义提示消息
VersionComparator.instance.setInfoMessages(MyCustomInfoMessage());
完整示例Demo
以下是一个完整的示例代码,展示了如何使用version_comparator
插件来比较应用版本,并根据比较结果显示不同的UI。
import 'package:flutter/material.dart';
import 'package:version_comparator/version_comparator.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(home: MyHomePage());
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _isLoading = false;
String _versionResult = '';
[@override](/user/override)
void initState() {
super.initState();
// 替换提示信息(可选)
VersionComparator.instance.setInfoMessages(CustomInfoMessage());
// 替换错误信息(可选)
VersionComparator.instance.setErrorMessages(CustomErrorMessage());
}
void _setLoading(bool value) {
setState(() {
_isLoading = value;
});
}
void _setResult(String message) {
setState(() {
_versionResult = message;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Version Comparator')),
body: buildVersionCompareWithAlertDialog(),
);
}
// 使用Widget模式比较版本
Widget buildVersionCompareWithWidget() {
return AppVersionComparatorView.widget(
errorPageBuilder: (_, error) => Center(child: Text(error)),
onCompareSuccess: (data) => debugPrint('Success: ${data.storeVersion}'),
outOfDateVersionPageBuilder: (_, error, data) =>
_buildOutOfDateWidget(error, data),
huaweiId: 'HUAWEI_APP_ID', // 如果需要比较华为应用市场的版本,请设置此参数
child: _buildBody(),
);
}
// 使用AlertDialog模式比较版本
Widget buildVersionCompareWithAlertDialog() {
return AppVersionComparatorView.alertDialog(
onCompareSuccess: (data) => debugPrint('Success: ${data.storeVersion}'),
invalidVersionDialogContentBuilder: (context, message) =>
Text('Error: $message'),
child: _buildBody(),
);
}
// 比较本地版本和商店版本
Future<void> compareVersion() async {
_setLoading(true);
final result = await VersionComparator.instance.versionCompare();
_setLoading(false);
_setResultMessage(result);
}
// 自定义版本比较
Future<void> customCompareVersion() async {
_setLoading(true);
final result = await VersionComparator.instance.customCompare(
localVersion: '1.0.0',
store: MyStoreModel(appId: 'YOUR_APP_BUNDLE_ID'),
customUpdateLink: (body) => 'YOU CAN ADD CUSTOM UPDATE LINK',
onConvertVersion: (responseBody) {
final result = MyVersionConvertManager()
.convert(MyVersionResponseModel.fromResponse(responseBody));
return result.data;
},
);
_setLoading(false);
_setResultMessage(result);
}
// 显示版本更新对话框
Future<void> _showVersionDialog(VersionResponseModel versionResponseModel,
{bool isRequired = false}) async {
await VersionComparator.instance.showSimpleVersionDialog(
context,
versionResponseModel,
isUpdateRequired: isRequired,
);
}
Widget _buildOutOfDateWidget(String error, VersionResponseModel data) {
return Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(error, textAlign: TextAlign.center),
const SizedBox(height: 16),
Text('当前版本: ${data.localVersion}'),
Text('新版本: ${data.storeVersion}'),
],
);
}
Padding _buildBody() {
return Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(_versionResult, textAlign: TextAlign.center),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _isLoading ? null : () async => customCompareVersion(),
child: _isLoading
? const CircularProgressIndicator()
: const Text('比较应用版本'),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () async => await _showVersionDialog(_getResponseExample),
child: const Text('显示更新对话框'),
),
],
),
);
}
void _setResultMessage(DataResult<VersionResponseModel> result) {
if (result.isNotSuccess || result.data == null) {
_setResult('错误: ${result.message}');
} else if (result.data!.isAppVersionOld) {
_setResultAndShowVersionDialog(
'错误: 应用版本已过期,请更新', result.data!);
} else {
_setResult('成功: 应用版本已是最新');
}
}
Future<void> _setResultAndShowVersionDialog(
String message, VersionResponseModel responseModel) async {
_setResult(message);
await _showVersionDialog(responseModel);
}
VersionResponseModel get _getResponseExample {
return VersionResponseModel(
localVersion: '1.0.0',
storeVersion: '1.0.1',
updateLink: 'https://www.example.com/',
);
}
}
更多关于Flutter版本比较插件version_comparator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter版本比较插件version_comparator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用version_comparator
插件来进行版本比较的示例代码。
首先,你需要在你的pubspec.yaml
文件中添加version_comparator
依赖:
dependencies:
flutter:
sdk: flutter
version_comparator: ^1.0.0 # 请确保使用最新版本
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Dart代码中导入version_comparator
包并使用它来进行版本比较。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:version_comparator/version_comparator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Version Comparator Example'),
),
body: Center(
child: VersionComparisonDemo(),
),
),
);
}
}
class VersionComparisonDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
String version1 = '1.2.3';
String version2 = '1.2.4';
bool isVersion1Newer = compareVersion(version1, version2) < 0;
bool isVersion2Newer = compareVersion(version1, version2) > 0;
bool areVersionsEqual = compareVersion(version1, version2) == 0;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Version 1: $version1'),
Text('Version 2: $version2'),
SizedBox(height: 20),
Text(
'Is Version 1 newer? ${isVersion1Newer ? 'Yes' : 'No'}',
style: TextStyle(fontSize: 20),
),
Text(
'Is Version 2 newer? ${isVersion2Newer ? 'Yes' : 'No'}',
style: TextStyle(fontSize: 20),
),
Text(
'Are versions equal? ${areVersionsEqual ? 'Yes' : 'No'}',
style: TextStyle(fontSize: 20),
),
],
);
}
}
在这个示例中,我们定义了两个版本号version1
和version2
,然后使用compareVersion
函数来比较它们。compareVersion
函数返回一个整数,如果第一个版本比第二个版本旧,则返回负数;如果两个版本相等,则返回0;如果第一个版本比第二个版本新,则返回正数。
这个示例展示了如何使用version_comparator
包来比较两个版本号,并根据比较结果更新UI。你可以根据需要将此逻辑集成到你的Flutter应用程序中。