Flutter app 更新

Flutter 不支持 code-push。 在android 只能强制更新apk或者跳转到谷歌stop去下载。 在ios,只能提醒去 App Store 官网下载。

步骤一

  • 创建一个 Updater 类。
  • 获取线上最新的版本号与本地版本号。
  • 通过字符串 hashCode 比较版本号是否一致。
  • 如果不一致,那么弹出更新对话框。
  • 更新提醒对话框我们一天弹出一次就好了。
  • 如果用户点击更新,则跳转到对应的地址。

class Updater extends StatefulWidget {
  const Updater({@required this.child, Key key}) : super(key: key);

  final Widget child;

  @override
  State createState() => UpdaterState();
}

class UpdaterState extends State<Updater> {
  @override
  void initState() {
    super.initState();
    _checkForUpdates();
  }

  Future<void> _checkForUpdates() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    String version = packageInfo.version;
    String updateUrl = Theme.of(context).platform == TargetPlatform.iOS
        ? updateUrlLs['ios']
        : updateUrlLs['android'];

    String updateTime = PreferModel.prefs.getString('updateTime') ?? null;

    /// 一天之内只提醒一次需要更新
    if (updateTime != null && DateTime.parse(updateTime).day == DateTime.now().day) {
      return;
    }
    try {
      Response response = await Dio().get(updateUrl);
      String versionShort = response.data['versionShort'];
      if (version.hashCode != versionShort.hashCode) {
        final bool wantsUpdate = await showDialog<bool>(
          context: context,
          builder: (BuildContext context) =>
              _buildDialog(context, response.data['update_url'], packageInfo, versionShort),
          barrierDismissible: false,
        );
        if (wantsUpdate != null && wantsUpdate) {
          PreferModel.prefs.remove('updateTime');
          launch(response.data['update_url'],
          forceSafariVC: false,
          );
        } else {
          PreferModel.prefs.setString('updateTime', DateTime.now().toString());
        }
      }
    } catch (e) {}
  }

  Widget _buildDialog(
      BuildContext context, String updateUrl, PackageInfo packageInfo, String versionShort) {
    final ThemeData theme = Theme.of(context);
    final TextStyle dialogTextStyle =
        theme.textTheme.subhead.copyWith(color: theme.textTheme.caption.color);
    return CupertinoAlertDialog(
      title: Text('是否立即更新${packageInfo.appName}?'),
      content: Text('检测到新版本 v$versionShort', style: dialogTextStyle),
      actions: <Widget>[
        CupertinoDialogAction(
          child: const Text('下次再说'),
          onPressed: () {
            Navigator.pop(context, false);
          },
        ),
        CupertinoDialogAction(
          child: const Text('立即更新'),
          onPressed: () {
            Navigator.pop(context, true);
          },
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) => widget.child;
}

复制代码

转载于:https://juejin.im/post/5ceca883518825456940696f

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值