Flutter应用升级管理插件upgrade_util的使用

Flutter应用升级管理插件upgrade_util的使用

目前,该插件仅支持Android和iOS。

第三方库的使用

  • 使用dio下载apk文件,此功能已经内置在插件中,无需单独引用。

准备工作

版本约束

  sdk: ">=3.1.0 <4.0.0"
  flutter: ">=3.13.0"

依赖项

  1. pubspec.yaml文件中添加upgrade_util依赖。
dependencies:
  upgrade_util: ^latest_version
  1. 执行flutter pub get命令获取包。
flutter pub get
  1. 引入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,目前有三种模式;

    1. JumpMode.detailPage,跳转到应用详情页面(即产品介绍页面);
    2. JumpMode.reviewsPage,跳转到应用评论页面;
    3. JumpMode.writeReview,跳转到应用评论页面并评论。
  • 对于iOS,appleId是必需的,这是App Store的应用编号;

  • 对于Android,marketPackageName是跳转到的应用市场的包名,不是必需的;

  • 字段packageName不再提供,因为项目统一使用包名。

Android特有的方法

  1. getDownloadPath,获取软件下载保存路径;
  2. installApk,安装APK,并跳转到安装引导页;
  3. 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

1 回复

更多关于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插件:

  1. 导入插件

在你的Dart文件中导入upgrade_util插件:

import 'package:upgrade_util/upgrade_util.dart';
  1. 配置升级信息

你需要配置应用的当前版本信息和升级信息。这通常是通过从服务器获取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,  // 是否强制升级
};
  1. 检查版本并显示升级提示

使用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包含了最新版本号、下载地址、升级说明和是否强制升级等信息。
  • onUpgradeonIgnoreonLater回调分别处理用户点击升级、忽略和稍后再升级按钮的情况。

请根据你的实际需求调整上述代码,特别是升级信息的获取部分,通常这些信息会从服务器获取。

回到顶部