You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用更新实现求助:upgrader包无提示问题

Flutter应用更新实现方案及upgrader包排坑

一、通用更新实现方案

1. 自定义后端手动检查更新

适合需要完全控制更新逻辑的场景,步骤如下:

  • 后端维护当前最新版本号(可存在数据库或配置文件中)
  • App启动/进入首页时,请求后端接口获取最新版本
  • 对比本地版本(通过PackageInfo.fromPackage()获取)与最新版本:
    • 若本地版本更低,弹出自定义对话框提示更新
    • 安卓可引导用户下载APK文件,iOS直接跳转App Store
  • 代码示例:
import 'package:package_info_plus/package_info_plus.dart';
import 'package:dio/dio.dart';

Future<void> checkUpdate(BuildContext context) async {
  final packageInfo = await PackageInfo.fromPackage();
  final currentVersion = packageInfo.version;
  
  // 请求后端获取最新版本
  final response = await Dio().get('https://your-api.com/latest-version');
  final latestVersion = response.data['version'];
  
  if (latestVersion.compareTo(currentVersion) > 0) {
    // 弹出更新提示
    showDialog(
      context: context,
      builder: (ctx) => AlertDialog(
        title: const Text('发现新版本'),
        content: const Text('请更新到最新版本以获得更好体验'),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(ctx),
            child: const Text('稍后'),
          ),
          TextButton(
            onPressed: () {
              // 安卓跳转下载链接,iOS跳转App Store
              // 可使用url_launcher包打开对应链接
            },
            child: const Text('立即更新'),
          ),
        ],
      ),
    );
  }
}

2. 官方推荐的in_app_update包

针对Google Play应用,支持即时更新和灵活更新两种模式,无需用户跳转应用商店,直接在App内完成更新:

  • 添加依赖:in_app_update: ^4.1.0
  • 核心代码示例:
import 'package:in_app_update/in_app_update.dart';

Future<void> checkForUpdate() async {
  final updateInfo = await InAppUpdate.checkForUpdate();
  if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
    // 灵活更新(用户可选择稍后)
    await InAppUpdate.startFlexibleUpdate();
    // 或强制更新(必须更新才能使用)
    // await InAppUpdate.performImmediateUpdate();
  }
}

二、upgrader包无法触发提示的排查与修复

如果使用upgrader未收到更新提示,按以下步骤排查:

1. 基础配置检查

  • 确保pubspec.yaml的版本格式正确:比如version: 1.0.0+1(+后为build号,部分应用商店会用此字段判断更新)
  • 初始化Upgrader时必须指定正确的appId:
UpgradeAlert(
  upgrader: Upgrader(
    androidAppId: 'com.your.app.package.name', // 安卓包名
    iOSAppId: 'com.your.app.bundle.id', // iOS Bundle ID
  ),
  child: const YourHomePage(),
)

2. 测试环境强制触发提示

upgrader默认会跳过开发环境的更新检查,测试时可强制开启调试模式:

Upgrader(
  isDebug: true, // 强制显示更新提示,方便测试
  debugLogging: true, // 打印日志,排查请求问题
)

3. 网络与权限检查

  • 安卓:AndroidManifest.xml中必须添加<uses-permission android:name="android.permission.INTERNET"/>
  • iOS:Info.plist中确保允许网络请求(ATS未禁用或已配置对应域名)

4. 版本号对比逻辑

upgrader默认拉取应用商店的版本号进行对比,注意:

  • 应用商店的版本号必须高于本地App的版本号
  • 版本号格式要统一(比如均为x.y.z格式,避免1.0与1.0.1这种格式差异导致对比失败)

内容的提问来源于stack exchange,提问作者Rahul Jayaram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:45:24