zoukankan      html  css  js  c++  java
  • Flutter学习笔记(41)--自定义Dialog实现版本更新弹窗

    如需转载,请注明出处:Flutter学习笔记(41)--自定义Dialog实现版本更新弹窗

    功能点:

    1.更新弹窗UI

    2.强更与非强更且别控制

    3.屏蔽物理返回键(因为强更的时候点击返回键,弹窗会消失)

    4.点击弹窗外透明区域时,弹窗不消失

    先看下效果图:

    Dialog实现代码:

    import 'package:flutter/material.dart';
    import 'package:xiaopijiang/utils/assets_util.dart';
    import 'package:xiaopijiang/utils/toast_util.dart';
    
    ///created by WGH
    ///on 2020/7/23
    ///description:版本更新提示弹窗
    class UpdateDialog extends Dialog {
      final String upDateContent;
      final bool isForce;
    
      UpdateDialog({this.upDateContent, this.isForce});
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Container(
                 319,
                height: 370,
                child: Stack(
                  children: <Widget>[
                    Image.asset(
                      AssetsUtil.getImagePath(
                          imageName: 'bg_update', suffix: 'png'),
                      fit: BoxFit.cover,
                    ),
                    Container(
                       double.infinity,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: <Widget>[
                          Container(
                            margin: EdgeInsets.only(top: 110),
                            child: Text('发现新版本',
                                style: TextStyle(
                                    fontSize: 20,
                                    color: Colors.white,
                                    decoration: TextDecoration.none)),
                          ),
                          Text(upDateContent,
                              style: TextStyle(
                                  fontSize: 16,
                                  color: Colors.black54,
                                  decoration: TextDecoration.none)),
                          Container(
                             250,
                            height: 42,
                            margin: EdgeInsets.only(bottom: 15),
                            child: RaisedButton(
                                color: Colors.red,
                                shape: StadiumBorder(),
                                child: Text(
                                  '立即更新',
                                  style:
                                      TextStyle(fontSize: 20, color: Colors.white),
                                ),
                                onPressed: () {
                                  ToastUtil.showTips('下载apk');
                                }),
                          )
                        ],
                      ),
                    ),
                  ],
                ),
              ),
              GestureDetector(
                onTap: () {
                  Navigator.pop(context);
                },
                child: Offstage(
                  offstage: isForce,
                  child: Container(
                      margin: EdgeInsets.only(top: 30),
                      child: Image.asset(
                        AssetsUtil.getImagePath(
                            imageName: 'ic_update_close', suffix: 'png'),
                         35,
                        height: 35,
                      )),
                ),
              )
            ],
          ),
        );
      }
    
      static showUpdateDialog(
          BuildContext context, String mUpdateContent, bool mIsForce) {
        return showDialog(
            barrierDismissible: false,
            context: context,
            builder: (BuildContext context) {
              return WillPopScope(
                  child: UpdateDialog(
                      upDateContent: mUpdateContent, isForce: mIsForce),onWillPop: _onWillPop);
            });
      }
    
      static Future<bool> _onWillPop() async{
        return false;
      }
    }

    调用Dialog:

      _checkUpdate() async{
        int serviceVersionCode = 101;
        PackageInfo packageInfo = await PackageInfo.fromPlatform();
        //获取当前的版本号
        int currentVersionCode = int.parse(packageInfo.version.replaceAll('.', ''));
        //如果获取服务器的版本号比当前应用程序的版本号还高,那么提示升级
        if (serviceVersionCode > currentVersionCode) {
          if(Platform.isAndroid){
            //Android平台在应用内进行更新
            //弹出"版本更新"的对话框
            UpdateDialog.showUpdateDialog(context, '1.修复已知bug
    2.优化用户体验', false);
          }else if(Platform.isIOS){
            //iOS平台跳转道AppStore进行更新
          }
        }
      }

    重点说明:

    屏蔽物理返回键(因为强更的时候点击返回键,弹窗会消失)

    barrierDismissible: false,

    4.点击弹窗外透明区域时,弹窗不消失

              return WillPopScope(
                  child: UpdateDialog(
                      upDateContent: mUpdateContent, isForce: mIsForce),
                  onWillPop: _onWillPop);
    
      static Future<bool> _onWillPop() async {
        return false;
      }
  • 相关阅读:
    laravel中使用ElasticSearch详情
    linux 使用大全
    常见监控软件介绍及原理介绍
    DNS与域名解析
    linux基础入门(基础命令+vi+shell)
    php-fpm与fastcgi、php-cgi之间的关系及源码解析
    web系统整体性能测试
    typescript入门
    webpack
    React
  • 原文地址:https://www.cnblogs.com/upwgh/p/13367589.html
Copyright © 2011-2022 走看看