Flutter应用内更新插件huawei_in_app_update的使用

Flutter应用内更新插件huawei_in_app_update的使用

插件简介

huawei_in_app_update 是一个Flutter插件,它使用华为官方的App Update API从AppGallery检查应用更新。请注意,此插件仅适用于Android平台。

前提条件

在运行项目之前,您必须将应用程序的AppGallery Connect配置文件添加到项目中。

使用方法

调用 HuaweiInAppUpdate.checkForUpdate() 将返回 UpgradeInfo 对象。您可以使用 upgradeInfo.updateAvailable 来检查是否有可用的更新。如果有更新可用,您可以使用 HuaweiInAppUpdate.showUpdateDialog() 显示更新对话框。如果将 force 参数设置为 true,则对话框将不可关闭,并且返回按钮也不会关闭对话框。

void checkForUpdate() async {
  if (Platform.isAndroid) {
    try {
      final upgradeInfo = await HuaweiInAppUpdate.checkForUpdate();
      if (upgradeInfo.updateAvailable) {
        // 显示更新对话框,force为false表示用户可以取消更新
        HuaweiInAppUpdate.showUpdateDialog(
          context: context,
          force: false,
        );
      } else {
        // 如果没有更新,显示提示信息
        await showDialog(
          context: context,
          builder: (_) {
            return AlertDialog(
              content: Text('No new update available'),
              actions: [
                TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text('Okay'),
                ),
              ],
            );
          },
        );
      }
    } on PlatformException catch (e) {
      // 捕获平台异常并显示错误信息
      showErrorDialog(e.code, e.message);
    }
  } else {
    // iOS设备不支持此功能
    showErrorDialog('IOS_NOT_SUPPORTED', 'iOS device is not supported');
  }
}

如果您希望在应用中使用不同的更新提示样式,可以使用 UpgradeInfo 中提供的信息创建自定义的小部件设计。

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 huawei_in_app_update 插件来检查和提示应用更新。

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:huawei_in_app_update/huawei_in_app_update.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _navigatorKey = GlobalKey<NavigatorState>();

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

  void checkForUpdate() async {
    final context = _navigatorKey.currentState?.context ?? this.context;
    if (Platform.isAndroid) {
      try {
        final upgradeInfo = await HuaweiInAppUpdate.checkForUpdate();
        if (upgradeInfo.updateAvailable) {
          // 显示更新对话框,force为false表示用户可以取消更新
          HuaweiInAppUpdate.showUpdateDialog(
            context: context,
            force: false,
          );
        } else {
          // 如果没有更新,显示提示信息
          await showDialog(
            context: context,
            builder: (_) {
              return AlertDialog(
                content: Text('No new update available'),
                actions: [
                  TextButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Text('Okay'),
                  ),
                ],
              );
            },
          );
        }
      } on PlatformException catch (e) {
        // 捕获平台异常并显示错误信息
        showErrorDialog(e.code, e.message);
      }
    } else {
      // iOS设备不支持此功能
      showErrorDialog('IOS_NOT_SUPPORTED', 'iOS device is not supported');
    }
  }

  void showErrorDialog(String title, String? message) {
    final context = _navigatorKey.currentState?.context ?? this.context;
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text(title),
          content: Text(message ?? 'Error'),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('OK'),
            ),
          ],
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: _navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Huawei App Update Plugin'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () => checkForUpdate(),
            child: Text('Check Update'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter应用中集成并使用huawei_in_app_update插件以实现应用内更新功能,可以通过以下步骤和代码案例来完成。这个插件允许华为设备上的用户在不离开应用的情况下更新应用。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  huawei_in_app_update: ^x.y.z  # 请替换为最新版本号

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

2. 配置Android项目

确保你已经在华为开发者控制台创建了应用并下载了agconnect-services.json文件。将此文件放置在android/app/目录下。

3. 初始化插件并检查更新

在你的Flutter项目中,你可以通过以下步骤初始化插件并检查应用更新。

初始化插件

在你的主Dart文件中(例如main.dart),导入huawei_in_app_update包并初始化:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late InAppUpdateManager _inAppUpdateManager;

  @override
  void initState() {
    super.initState();
    _inAppUpdateManager = InAppUpdateManager();
    _checkForUpdates();
  }

  Future<void> _checkForUpdates() async {
    try {
      InAppUpdateInfo updateInfo = await _inAppUpdateManager.checkForUpdate();
      if (updateInfo.updateAvailability == UpdateAvailability.immediate) {
        // 如果有可用的立即更新
        _startImmediateUpdate(updateInfo);
      } else if (updateInfo.updateAvailability == UpdateAvailability.flexible) {
        // 如果有可用的灵活更新
        // 可以在这里提示用户更新,并在用户同意后调用_startFlexibleUpdate()
        print("Flexible update available");
      } else {
        // 没有更新
        print("No update available");
      }
    } catch (e) {
      print("Error checking for update: $e");
    }
  }

  Future<void> _startImmediateUpdate(InAppUpdateInfo updateInfo) async {
    try {
      InAppUpdateResult result = await _inAppUpdateManager.startUpdate(
        updateInfo: updateInfo,
        immediateUpdateMode: ImmediateUpdateMode.defaultMode,
      );
      if (result.updateState == UpdateState.completed) {
        // 更新完成,提示用户重启应用
        print("Update completed, prompt user to restart");
      } else {
        // 处理其他状态,例如下载中、失败等
        print("Update state: ${result.updateState}");
      }
    } catch (e) {
      print("Error starting immediate update: $e");
    }
  }

  // 如果需要实现灵活更新,可以添加_startFlexibleUpdate()方法
  // Future<void> _startFlexibleUpdate() async {
  //   // 实现灵活更新的逻辑
  // }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('In-App Update Demo'),
        ),
        body: Center(
          child: Text('Checking for updates...'),
        ),
      ),
    );
  }
}

4. 处理更新状态(可选)

对于灵活更新,你可能需要监听更新状态并在UI中反映出来。这可以通过监听InAppUpdateManager的状态流来实现。以下是一个简单的示例:

// 在你的State类中

StreamSubscription<InAppUpdateState>? _updateStateSubscription;

@override
void initState() {
  super.initState();
  _inAppUpdateManager = InAppUpdateManager();
  _checkForUpdates();

  // 监听更新状态
  _updateStateSubscription = _inAppUpdateManager.updateStateStream.listen((state) {
    if (state.updateState == UpdateState.downloaded) {
      // 更新已下载,提示用户安装
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text('Update Ready'),
          content: Text('A new version of the app has been downloaded. Restart to apply.'),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                // 重启应用
                SystemChannels.platform.invokeMethod('SystemNavigator.pop');
                _inAppUpdateManager.completeUpdate();
              },
              child: Text('Restart'),
            ),
          ],
        ),
      );
    } else if (state.updateState == UpdateState.failed) {
      // 更新失败,提示用户
      print("Update failed: ${state.installError}");
    }
    // 处理其他状态...
  });
}

@override
void dispose() {
  _updateStateSubscription?.cancel();
  super.dispose();
}

注意

  • 确保你的应用已经在华为应用市场上架,并且agconnect-services.json文件中的包名与应用市场上的包名一致。
  • 测试应用内更新时,请确保使用华为设备并登录华为账号。
  • 根据实际需求调整UI和逻辑,例如添加进度条显示下载进度等。

以上代码案例展示了如何在Flutter应用中集成并使用huawei_in_app_update插件进行应用内更新。根据具体需求,你可以进一步扩展和优化这些代码。

回到顶部