Flutter应用更新管理插件update_center的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter应用更新管理插件update_center的使用

介绍

Update Center 是一个 Flutter 插件,允许你在不同平台上(如 Android 和 Windows)实现多平台的应用更新检查。以下是该插件的主要功能:

  • 自定义对话框:根据你的应用风格创建自己的对话框。
  • 自动更新检查:根据运行平台自动检查更新。
  • 防止跳过更新:如果 JSON 文件中的版本号高于本地版本号,插件会阻止用户关闭对话框。
  • 文件管理:插件可以处理下载的文件,并在更新完成后删除旧文件。如果用户未更新且有新版本发布,插件会删除旧文件并下载新文件,而不是重新启动下载。
  • 支持多种文件格式:Windows 支持 zip 和 exe 文件,Android 类似。
  • 灵活配置:插件提供了多种可自定义的设置。

快速开始

添加依赖

首先,在 pubspec.yaml 文件中添加 update_center 依赖:

dependencies:
  update_center: ^2.0.1

JSON 文件结构

插件通过 JSON 文件来获取更新信息。以下是一个示例 JSON 文件结构:

{
  "android": {
    "versionName": "1.1.0",
    "downloadUrl": "https://example.com/UpdateCenter/app.apk",
    "changeLog": "- bug fixed; \n- new ui;",
    "sourceUrl": "https://example.com/",
    "versionCode": 2,
    "minSupport": 1
  },

  "windows": {
    "versionName": "5.0.0",
    "downloadUrl": "https://example.com/UpdateCenter/app-windows.exe",
    "changeLog": "- Bug fixes and performance improvements. \n- New Icon;",
    "sourceUrl": "https://example.com/",
    "versionCode": 34,
    "minSupport": 14
  }
}

JSON 结构说明

  • versionName:新的版本名称。
  • downloadUrl:下载新版本 APK 或 EXE 文件的 URL。
  • changeLog:更新日志,描述新版本的变化。
  • sourceUrl:更多关于更新的信息或源代码的 URL。
  • versionCode:新的版本号。
  • minSupport:最低支持的版本号,低于此版本号的设备将被强制更新。

示例代码

初始化和配置插件

Android 权限

首先,确保在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

完整的插件设置

以下是完整的插件初始化和配置示例代码:

import 'package:flutter/material.dart';
import 'package:update_center/update_center.dart';
import 'package:url_launcher/url_launcher.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late UpdateCenter updateCenter;

  static const String _apiUrl = 'https://example.com/UpdateCenter/update_center.json';

  _launchURL(String sourceUrl) async {
    final Uri url = Uri.parse(sourceUrl);
    if (!await launchUrl(url)) {
      throw Exception('Could not launch $sourceUrl');
    }
  }

  [@override](/user/override)
  void initState() {
    initializeUpdateCenter();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Update Center v2.0.0'),
        ),
        body: Center(
          child: OutlinedButton(
            onPressed: () => checkUpdate(), // 点击按钮检查更新
            child: const Text('Check update'),
          ),
        ),
      ),
    );
  }

  void initializeUpdateCenter() {
    // 主要插件设置
    updateCenter = UpdateCenter(
      context: context,
      urlJson: _apiUrl, // 获取更新信息的 JSON URL (请替换为你的 URL)

      config: UpdateCenterConfig(
        globalConfig: GlobalConfig(
          checkStart: false, // 是否在应用启动时检查更新
          noUpdateAvailableToast: true, // 如果没有可用更新是否显示 Toast 提示
          sourceUrl: false, // 是否启用点击链接而不是下载文件
          openingFile: true, // 是否打开已下载的文件而不是重新下载

          // 显示没有可用更新的通知
          androidNoUpdateAvailableBuilder: (BuildContext context) {
            Fluttertoast.showToast(msg: 'No updates found');
          },
          windowsNoUpdateAvailableBuilder: (BuildContext context) {
            ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
              content: Text('No updates found'),
              duration: Duration(seconds: 2),
            ));
          },

          // 构建每个平台的更新对话框
          androidDialogBuilder: (BuildContext context, AndroidModel model, UpdateCenterConfig config, DownloadState downloadState, bool allowSkip) {
            return showDialog(
              context: context,
              barrierDismissible: allowSkip,
              builder: (BuildContext context) {
                return AlertDialog(
                  title: Text(model.versionName),
                  content: Text(model.changeLog),
                  actions: [
                    if (allowSkip)
                      TextButton(
                        onPressed: () => Navigator.of(context).pop(),
                        child: const Text("Close"),
                      ),

                    // 显示下载进度
                    ValueListenableBuilder<bool>(
                      valueListenable: downloadState.isDownloading,
                      builder: (context, isDownloading, child) {
                        return TextButton(
                          onPressed: isDownloading
                              ? null
                              : () async {
                                  downloadState.isDownloading.value = true;
                                  // 确保下载时按钮不可用
                                  await OnDownload.initiateUpdate(
                                    url: model.downloadUrl,
                                    versionName: model.versionName,
                                    config: config,
                                    downloadState: downloadState,
                                    sourceUrl: model.sourceUrl,
                                    launchUrl: (url) => _launchURL(url),
                                  );
                                },
                          child: isDownloading
                              ? ValueListenableBuilder<double>(
                                  valueListenable: downloadState.progress,
                                  builder: (context, progress, _) {
                                    int progressValue = (progress * 100).toInt();
                                    return AnimatedFlipCounter(
                                      suffix: '%',
                                      duration: const Duration(milliseconds: 500),
                                      value: progressValue,
                                      textStyle: TextStyle(color: Theme.of(context).colorScheme.onSurface),
                                    );
                                  },
                                )
                              : const Text('Download'),
                        );
                      },
                    )
                  ],
                );
              },
            );
          },

          windowsDialogBuilder: (BuildContext context, WindowsModel model, UpdateCenterConfig config, DownloadState downloadState, bool allowSkip) {
            return showDialog(
              context: context,
              barrierDismissible: allowSkip,
              builder: (BuildContext context) {
                return AlertDialog(
                  title: Text(model.versionName),
                  content: Text(model.changeLog),
                  actions: [
                    if (allowSkip)
                      TextButton(
                        onPressed: () => Navigator.of(context).pop(),
                        child: const Text("Close"),
                      ),

                    // 显示下载进度
                    ValueListenableBuilder<bool>(
                      valueListenable: downloadState.isDownloading,
                      builder: (context, isDownloading, child) {
                        return TextButton(
                          onPressed: isDownloading
                              ? null
                              : () async {
                                  downloadState.isDownloading.value = true;
                                  // 确保下载时按钮不可用
                                  await OnDownload.initiateUpdate(
                                    url: model.downloadUrl,
                                    versionName: model.versionName,
                                    config: config,
                                    downloadState: downloadState,
                                    sourceUrl: model.sourceUrl,
                                    launchUrl: (url) => _launchURL(url),
                                  );
                                },
                          child: isDownloading
                              ? ValueListenableBuilder<double>(
                                  valueListenable: downloadState.progress,
                                  builder: (context, progress, _) {
                                    int progressValue = (progress * 100).toInt();
                                    return AnimatedFlipCounter(
                                      suffix: '%',
                                      duration: const Duration(milliseconds: 500),
                                      value: progressValue,
                                      textStyle: TextStyle(color: Theme.of(context).colorScheme.onSurface),
                                    );
                                  },
                                )
                              : const Text('Download'),
                        );
                      },
                    )
                  ],
                );
              },
            );
          },
        ),
      ),
    );
  }

  // 检查更新 (例如通过按钮触发)
  checkUpdate() async {
    await updateCenter.check();
  }
}

更多关于Flutter应用更新管理插件update_center的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用更新管理插件update_center的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用update_center插件进行更新管理的示例代码。update_center插件通常用于检查应用更新、下载更新包以及提示用户进行安装。

首先,你需要在你的pubspec.yaml文件中添加update_center依赖:

dependencies:
  flutter:
    sdk: flutter
  update_center: ^最新版本号  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中按照以下步骤使用update_center插件:

  1. 初始化UpdateCenter

    在你的主应用文件(例如main.dart)中,初始化UpdateCenter

import 'package:flutter/material.dart';
import 'package:update_center/update_center.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化UpdateCenter
    UpdateCenter.init(
      context: context,
      iosAppId: '你的iOS App ID', // 仅iOS需要
      androidChannel: '你的Android更新渠道', // 仅Android需要
      forceUpdate: false, // 是否强制更新
      autoCheck: true, // 是否自动检查更新
      checkInterval: 7 * 24 * 60 * 60, // 自动检查更新的间隔,单位秒(这里设置为7天)
      onUpdateFound: (updateInfo) {
        // 当发现更新时的回调
        showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              title: Text('发现新版本'),
              content: Text('版本:${updateInfo.version}\n更新内容:${updateInfo.changeLog}'),
              actions: <Widget>[
                FlatButton(
                  child: Text('取消'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
                FlatButton(
                  child: Text('立即更新'),
                  onPressed: () {
                    UpdateCenter.downloadUpdate(updateInfo).then((result) {
                      if (result) {
                        // 下载完成后提示用户安装
                        UpdateCenter.installUpdate().then((installResult) {
                          if (installResult) {
                            // 安装成功提示
                            showDialog(
                              context: context,
                              builder: (context) {
                                return AlertDialog(
                                  title: Text('更新成功'),
                                  content: Text('应用将重启以应用更新。'),
                                  actions: <Widget>[
                                    FlatButton(
                                      child: Text('确定'),
                                      onPressed: () {
                                        Navigator.of(context).pop();
                                        // 这里可以添加退出应用代码,以便用户重启应用
                                        // SystemNavigator.pop(); // 仅用于Android
                                      },
                                    ),
                                  ],
                                );
                              },
                            );
                          } else {
                            // 安装失败提示
                            showDialog(
                              context: context,
                              builder: (context) {
                                return AlertDialog(
                                  title: Text('更新失败'),
                                  content: Text('安装更新失败,请稍后重试。'),
                                  actions: <Widget>[
                                    FlatButton(
                                      child: Text('确定'),
                                      onPressed: () {
                                        Navigator.of(context).pop();
                                      },
                                    ),
                                  ],
                                );
                              },
                            );
                          }
                        });
                      } else {
                        // 下载失败提示
                        showDialog(
                          context: context,
                          builder: (context) {
                            return AlertDialog(
                              title: Text('下载失败'),
                              content: Text('更新下载失败,请稍后重试。'),
                              actions: <Widget>[
                                FlatButton(
                                  child: Text('确定'),
                                  onPressed: () {
                                    Navigator.of(context).pop();
                                  },
                                ),
                              ],
                            );
                          },
                        );
                      }
                    });
                    Navigator.of(context).pop();
                  },
                ),
              ],
            );
          },
        );
      },
    );

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Update Center Demo'),
        ),
        body: Center(
          child: Text('Hello, Flutter!'),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  • 初始化UpdateCenter,设置了一些必要的参数,如iOS的App ID、Android的更新渠道、是否强制更新、是否自动检查更新以及自动检查的间隔。
  • 当发现更新时,显示一个对话框,提示用户有新版本可用,并提供“取消”和“立即更新”的选项。
  • 用户选择“立即更新”后,开始下载更新包,并在下载完成后提示用户安装更新。

请注意,UpdateCenter插件的具体用法可能会根据插件的版本和平台有所不同,因此建议查阅最新的官方文档以获取最准确的信息。

此外,这个示例仅展示了基本的使用流程,实际应用中可能还需要处理更多的边缘情况和错误处理。

回到顶部