Flutter 应用更新 - 简化代码实现

本文提供 Flutter 应用更新的代码示例,简化了代码结构,并使用 async/await 提高代码可读性。示例代码涵盖了新版本检测、下载安装、更新提示等功能,并提供 Android 和 iOS 平台的解决方案。

void updateappx() async {
  final value = await getApplicationDocumentsDirectory();
  final pathx = value.path;
  final file = File('$pathx/version.txt');
  
  if (await file.exists()) {
    localversion = await file.readAsString();
    final dio = Dio();
    final value = await dio.get('https://update-nepucouseupdate-bmgwsddxxl.cn-hongkong.fcapp.run/update');
    final version = value.data[0]['version'].toString();
    
    if (version != Global.version && version != localversion) {
      await Dialogs.materialDialog(
        color: Colors.white,
        msg: '要下载吗?',
        title: '有新版本啦,版本号是$version
${value.data[0]['descrption']}',
        lottieBuilder: Lottie.asset(
          'assets/rockert-new.json',
          fit: BoxFit.contain,
        ),
        context: context,
        actions: [
          IconButton(
            onPressed: () {
              file.writeAsString(version);
              Navigator.pop(context);
            },
            icon: Icon(Icons.cancel_outlined),
          ),
          IconButton(
            onPressed: () async {
              file.writeAsString(version);
              Navigator.pop(context);
              
              if (Platform.isAndroid) {
                final pd = ProgressDialog(context: context);
                pd.show(
                  max: 100,
                  msg: '准备下载更新...',
                  msgMaxLines: 5,
                  completed: Completed(
                    completedMsg: "下载完成!",
                    completedImage: AssetImage("assets/completed.gif"),
                    completionDelay: 2500,
                  ),
                );
                
                await EasyAppInstaller.instance.downloadAndInstallApk(
                  fileUrl: value.data[0]['link'],
                  fileDirectory: "updateApk",
                  fileName: "newApk.apk",
                  explainContent: "快去开启权限!!!",
                  onDownloadingListener: (progress) {
                    if (progress < 100) {
                      pd.update(value: progress.toInt(), msg: '安装包正在下载...');
                    } else {
                      pd.update(value: progress.toInt(), msg: '安装包下载完成...');
                    }
                  },
                  onCancelTagListener: (cancelTag) {
                    _cancelTag = cancelTag;
                  },
                );
              } else {
                Clipboard.setData(ClipboardData(
                  text: 'https://wwai.lanzouy.com/b02pwpe5e?password=4huv'
                ));
                
                AchievementView(context,
                  title: "复制成功",
                  subTitle: '请手动去浏览器粘贴网址,密码是4huv,请手动下载对应您的平台',
                  icon: Icon(Icons.insert_emoticon, color: Colors.white),
                  color: Colors.green,
                  duration: Duration(seconds: 15),
                  isCircle: true,
                  listener: (status) { print(status); },
                ).show();
              }
            },
            icon: Icon(Icons.check),
          ),
        ],
      );
    }
  } else {
    await file.create();
    await getApplicationDocumentsDirectory().then((value) async {
      if (await file.exists()) {
        final dio = Dio();
        final value = await dio.get('https://update-nepucouseupdate-bmgwsddxxl.cn-hongkong.fcapp.run/update');
        final version = value.data[0]['version'].toString();
        print(value.toString());
        
        if (version != Global.version && version != localversion) {
          await Dialogs.materialDialog(
            color: Colors.white,
            msg: '要下载吗?',
            title: '有新版本啦,版本号是$version
${value.data[0]['descrption']}',
            lottieBuilder: Lottie.asset(
              'assets/rockert-new.json',
              fit: BoxFit.contain,
            ),
            context: context,
            actions: [
              IconButton(
                onPressed: () {
                  file.writeAsString(version);
                  Navigator.pop(context);
                },
                icon: Icon(Icons.cancel_outlined),
              ),
              IconButton(
                onPressed: () async {
                  file.writeAsString(version);
                  Navigator.pop(context);
                  
                  final pd = ProgressDialog(context: context);
                  pd.show(
                    max: 100,
                    msg: '准备下载更新...',
                    msgMaxLines: 5,
                    completed: Completed(
                      completedMsg: "下载完成!",
                      completedImage: AssetImage("assets/completed.gif"),
                      completionDelay: 2500,
                    ),
                  );
                  
                  await EasyAppInstaller.instance.downloadAndInstallApk(
                    fileUrl: value.data[0]['link'],
                    fileDirectory: "updateApk",
                    fileName: "newApk.apk",
                    explainContent: "快去开启权限!!!",
                    onDownloadingListener: (progress) {
                      if (progress < 100) {
                        pd.update(value: progress.toInt(), msg: '安装包正在下载...');
                      } else {
                        file.writeAsString(version);
                        
                        pd.update(value: progress.toInt(), msg: '安装包下载完成...');
                      }
                    },
                    onCancelTagListener: (cancelTag) {
                      _cancelTag = cancelTag;
                    },
                  );
                },
                icon: Icon(Icons.check),
              ),
            ],
          );
        }
      }
    });
  }
}

代码说明:

  1. 使用 async/await 简化代码逻辑,使代码更易读。
  2. 将文件操作和网络请求封装到 async 函数中,提高代码可读性。
  3. 使用 if 语句判断文件是否存在,避免重复读取文件内容。
  4. 使用 Dialogs.materialDialog 显示更新提示,并提供下载和取消按钮。
  5. 使用 EasyAppInstaller 库实现应用下载安装功能,支持 Android 和 iOS 平台。
  6. 在 iOS 平台,将下载链接复制到剪切板,用户手动下载。

注意:

  • 需要引入 dioeasy_app_installerdialogs 等库。
  • Global.version 变量需要替换成应用的当前版本号。
  • https://update-nepucouseupdate-bmgwsddxxl.cn-hongkong.fcapp.run/update 是更新信息接口地址,需要根据实际情况修改。
  • assets/rockert-new.json 是 Lottie 动画文件路径,需要根据实际情况修改。
  • assets/completed.gif 是下载完成动画文件路径,需要根据实际情况修改。

其他:

  • 代码示例仅供参考,实际项目中可能需要根据具体需求进行调整。
  • 建议使用第三方库,例如 package:update_app,简化更新功能的实现。

希望本文的代码示例能帮助你实现 Flutter 应用更新功能,如有疑问,请留言交流!

Flutter 应用更新 - 简化代码实现

原文地址: http://www.cveoy.top/t/topic/ojHs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录