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

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

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

简介

Updat 是一个简单易用的Flutter桌面应用程序更新管理插件,支持Windows、macOS和Linux。只需提供一个托管文件的地方以及一个检查最新版本的地方即可实现自动更新功能。

Logo

Demo

Demo

安装

在终端中运行以下命令来安装updat插件:

flutter pub add updat

🎉 完成,就是这么简单。

快速开始

基本集成

将以下代码添加到你希望显示更新窗口的地方:

import 'package:updat/updat.dart';

UpdatWidget(
  currentVersion: "1.0.0",
  getLatestVersion: () async {
    // 这里应该从服务器获取最新版本号,必须是语义化版本号
    return "1.0.1";
  },
  getBinaryUrl: (latestVersion) async {
    // 提供用户应下载的二进制文件链接,确保为正确的平台
    return "https://github.com/latest/release/bin.exe";
  },
  appName: "Updat Example", // 应用程序名称,用于命名下载的文件
),

或者使用UpdatWindowManager,让updat自动处理一切,将其放置在MaterialApp之后:

UpdatWindowManager(
  getLatestVersion: () async {
    final data = await http.get(Uri.parse(
      "https://api.github.com/repos/fluttertools/sidekick/releases/latest",
    ));
    return jsonDecode(data.body)["tag_name"];
  },
  getBinaryUrl: (version) async {
    return "https://github.com/fluttertools/sidekick/releases/download/$version/sidekick-${Platform.operatingSystem}-$version.$platformExt";
  },
  appName: "Updat Example",
  getChangelog: (_, __) async {
    final data = await http.get(Uri.parse(
      "https://api.github.com/repos/fluttertools/sidekick/releases/latest",
    ));
    return jsonDecode(data.body)["body"];
  },
  updateChipBuilder: floatingExtendedChipWithSilentDownload,
  currentVersion: '0.0.1',
  callback: (status) {},
  child: MaterialApp(...),
)

配置

UpdatWidget 参数

参数 类型 描述 默认值
currentVersion String 当前版本号,必须是语义化版本号 N/A
getLatestVersion Future<String> 获取最新版本号,必须是语义化版本号 N/A
getBinaryUrl Future<String> 提供特定版本的应用程序二进制文件下载链接 N/A
appName String 应用程序名称,用于命名下载的文件 N/A
getChangelog Future<String> 返回变更日志 N/A
callback void Function(…) 更新状态改变时调用的回调函数 N/A
getDownloadFileLocation Future<File> 选择更新文件的下载位置 N/A
updateChipBuilder Widget Function(…) 自定义更新提示小部件 N/A
updateDialogBuilder Widget Function(…) 自定义更新对话框 N/A
openOnDownload bool 是否在下载完成后自动打开安装程序 true
closeOnInstall bool 是否在安装完成后自动关闭应用程序 false

主题定制

Chips

  • defaultChip
  • defaultChipWithCheckFor
  • defaultChipWithSilentDownload
  • flatChip
  • flatChipWithCheckFor
  • flatChipWithSilentDownload
  • floatingExtendedChip
  • floatingExtendedChipWithSilentDownload

Dialogs

  • defaultDialog

高级使用

如果需要在下载发布资产时发送额外的HTTP头信息,可以设置UpdatGlobalOptions.downloadReleaseHeaders属性:

UpdatGlobalOptions.downloadReleaseHeaders = {
  "Authorization": "Bearer gh_pat_1234567889abcdefghijklm",
}

示例代码

完整的示例代码如下所示:

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:updat/updat_window_manager.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:updat/theme/chips/floating_with_silent_download.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ThemeModeManager(
      defaultThemeMode: ThemeMode.light,
      builder: (themeMode) {
        return MaterialApp(
          title: 'Updat Demo',
          theme: ThemeData(
            useMaterial3: true,
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          darkTheme: ThemeData.dark().copyWith(primaryColor: Colors.blue, useMaterial3: true),
          themeMode: themeMode,
          home: const MyHomePage(),
        );
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController titleController = TextEditingController(text: "Update Available");
  TextEditingController subtitleController = TextEditingController(text: "New version available");
  Color color = const Color(0xff1890ff);

  @override
  void dispose() {
    titleController.dispose();
    subtitleController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return UpdatWindowManager(
      getLatestVersion: () async {
        final data = await http.get(Uri.parse(
          "https://api.github.com/repos/fluttertools/sidekick/releases/latest",
        ));
        return jsonDecode(data.body)["tag_name"];
      },
      getBinaryUrl: (version) async {
        return "https://github.com/fluttertools/sidekick/releases/download/$version/sidekick-${Platform.operatingSystem}-$version.$platformExt";
      },
      appName: "Updat Example",
      getChangelog: (_, __) async {
        final data = await http.get(Uri.parse(
          "https://api.github.com/repos/fluttertools/sidekick/releases/latest",
        ));
        return jsonDecode(data.body)["body"];
      },
      updateChipBuilder: floatingExtendedChipWithSilentDownload,
      currentVersion: '0.0.1',
      callback: (status) {},
      child: Scaffold(
        body: SizedBox(
          width: double.infinity,
          child: SingleChildScrollView(
            child: Container(
              padding: const EdgeInsets.only(left: 50, right: 50),
              constraints: const BoxConstraints(maxWidth: 800),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  const Text("Updat Flutter Demo"),
                  const SizedBox(height: 20),
                  Wrap(
                    children: [
                      ElevatedButton.icon(
                        icon: const Icon(Icons.code_rounded),
                        onPressed: () {
                          launchUrlString("https://github.com/aguilaair/updat");
                        },
                        label: const Text("View the code"),
                      ),
                      const SizedBox(width: 20),
                      ElevatedButton.icon(
                        icon: const Icon(Icons.open_in_browser_rounded),
                        onPressed: () {
                          launchUrlString("https://pub.dev/packages/updat");
                        },
                        label: const Text("View the Package"),
                      ),
                    ],
                  ),
                  const SizedBox(height: 20),
                  const Text("Hello! Try customizing the update widget's display text and colors."),
                  const Divider(height: 20),
                  Wrap(
                    spacing: 40,
                    runSpacing: 20,
                    children: [
                      Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          const Text("Change the theme:"),
                          const SizedBox(height: 22),
                          Switch(
                            value: ThemeModeManager.of(context)!._themeMode == ThemeMode.dark,
                            onChanged: (value) {
                              ThemeModeManager.of(context)!.themeMode = value ? ThemeMode.dark : ThemeMode.light;
                            },
                          ),
                        ],
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

String get platformExt {
  switch (Platform.operatingSystem) {
    case 'windows':
      return 'msix';
    case 'macos':
      return 'dmg';
    case 'linux':
      return 'AppImage';
    default:
      return 'zip';
  }
}

通过上述步骤,您可以轻松地将Updat插件集成到您的Flutter应用程序中,并根据需要进行自定义配置。


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

1 回复

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


当然,以下是如何在Flutter应用中使用updat插件(假设你指的是一个常见的Flutter插件用于应用更新管理,尽管具体插件可能有所不同,但流程大致相同)的示例代码。请注意,具体插件的API可能会有所变化,因此请参考相应插件的官方文档获取最新信息。

首先,确保你已经在pubspec.yaml文件中添加了updat插件的依赖项(假设插件名为updat,实际名称可能不同):

dependencies:
  flutter:
    sdk: flutter
  updat: ^x.y.z  # 请替换为实际版本号

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

接下来,你可以在你的Flutter应用中使用该插件来检查和管理应用更新。以下是一个简单的示例,展示了如何检查更新并提示用户进行更新:

import 'package:flutter/material.dart';
import 'package:updat/updat.dart';  // 假设插件导入路径为'updat/updat.dart'

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Update Manager',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String latestVersion = "Unknown";
  bool updateAvailable = false;

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

  Future<void> _checkForUpdates() async {
    try {
      // 假设这里有一个方法来获取最新版本信息
      // 实际上,你可能需要调用后端API或检查某个远程服务器上的文件
      String newVersion = await Updat.checkForUpdates();  // 这是一个假设的方法
      
      // 设置状态以反映是否有可用的更新
      setState(() {
        latestVersion = newVersion;
        updateAvailable = currentAppVersion < newVersion;  // 假设currentAppVersion是应用的当前版本号
      });

      if (updateAvailable) {
        _showUpdateDialog();
      }
    } catch (e) {
      print("Error checking for updates: $e");
    }
  }

  void _showUpdateDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text("Update Available"),
          content: Text("A new version ($latestVersion) of the app is available. Please update."),
          actions: <Widget>[
            FlatButton(
              child: Text("Cancel"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            FlatButton(
              child: Text("Update"),
              onPressed: () {
                // 这里可以添加打开应用商店页面或下载APK文件的逻辑
                // 例如,对于Android,可以打开Google Play商店的页面
                // 对于iOS,可以打开App Store的页面
                // 或者,对于自定义APK,可以使用URL_LAUNCHER插件来下载APK
                Navigator.of(context).pop();
                // Updat.downloadAndUpdate();  // 假设有一个方法来下载并安装更新
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Update Manager Demo"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Current Version: 1.0.0"),  // 假设当前版本号为1.0.0
            Text("Latest Version: $latestVersion"),
            SizedBox(height: 20),
            if (updateAvailable)
              Text(
                "An update is available. Please check the dialog for more details.",
                style: TextStyle(color: Colors.red),
              )
            else
              Text("No update available."),
          ],
        ),
      ),
    );
  }
}

注意

  1. 上述代码中的Updat.checkForUpdates()Updat.downloadAndUpdate()等方法是假设的,实际插件可能有不同的API。
  2. 你需要根据你的实际需求来实现版本号的比较和更新逻辑。
  3. 对于Android和iOS,应用更新通常通过应用商店进行。如果你正在分发自定义APK或IPA文件,你可能需要实现额外的下载和安装逻辑。
  4. 确保你遵循了应用商店的更新和分发政策。

请查阅你正在使用的具体更新管理插件的文档,以获取正确的API和使用方法。

回到顶部