Flutter學習筆記(41)--自定義Dialog實現版本更新彈窗

来源:https://www.cnblogs.com/upwgh/archive/2020/07/23/13367589.html
-Advertisement-
Play Games

功能點: 1.更新彈窗UI 2.強更與非強更且別控制 3.屏蔽物理返回鍵(因為強更的時候點擊返回鍵,彈窗會消失) 4.點擊彈窗外透明區域時,彈窗不消失 ...


如需轉載,請註明出處: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(
            width: 319,
            height: 370,
            child: Stack(
              children: <Widget>[
                Image.asset(
                  AssetsUtil.getImagePath(
                      imageName: 'bg_update', suffix: 'png'),
                  fit: BoxFit.cover,
                ),
                Container(
                  width: 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(
                        width: 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'),
                    width: 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\n2.優化用戶體驗', 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;
  }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Zabbix Server伺服器上安裝oracle-instantclient11.2後,結果使用sqlplus命令時遇到“sqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object f... ...
  • 本文更新於2020-05-03,使用MySQL 5.7,操作系統為Deepin 15.4。 許可權 許可權存取需要用到mysql庫中user、db、host、tables_priv、columns_prvi這幾個許可權表。列分為4個部分:用戶列、許可權列、安全列、資源控制列。許可權列又分為普通許可權和管理許可權。 ...
  • 開始之前明確一下死鎖和鎖等待這兩個事件的異同相同的之處:兩者都是當前事物在試圖請求被其他事物已經占用的鎖,從而造成當前事物無法執行的現象不同的之處:死鎖是相關session雙方或者多方中必然要犧牲(回滾)至少一個事務,否則雙方(或者多方)都無法執行;鎖等待則不然,對於暫時無法申請到的鎖,嘗試持續地“ ...
  • MHA(Master HA)是一款開源的 MySQL 的高可用程式,它為 MySQL 主從複製架構提供了 automating master failover 功能。MHA 在監控到 master 節點故障時,會提升其中擁有最新數據的 slave 節點成為新的master 節點,在此期間,MHA 會 ...
  • 原文地址:https://www.citusdata.com/blog/2019/02/08/the-most-useful-postgres-extension-pg-stat-statements/Postgresql的Extensions能夠延伸,更改和推進Postgres的行為。怎麼樣?通過 ...
  • 一、隱士intent,緊接著上一次複習 得到第二個活動返回的數據之後,我們需要重寫onActivityResult()來獲取數據 protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(r ...
  • 請輸入有效的11位數字手機號碼,或者包含區號的11位或12位數字座機號碼 出現這個問題按照提示上的來看應該是手機號碼輸入的不對 但是輸入的手機號碼的確是11位 這個手機號是開發者賬號綁定的手機號 也就是這個開發者賬號的蘋果ID綁定的電子郵箱和綁定的手機號碼 解決方案就是在手機上登錄上開發者的那個賬號 ...
  • 首先刪除 SceneDelegate.h 和 SceneDelegate.m ,info.plist中的 Application Scene Manifest 和 AppDelegate.m 中的 #pragma mark - UISceneSession lifecycle - (UISceneC ...
一周排行
    -Advertisement-
    Play Games
  • 記錄一篇.netwebapi開發過程 首先使用6+dapper+sqlserver 我們創建一個空項目使用HttpReports來監控api HttpReports 基於.Net Core 開發的APM監控系統,使用MIT開源協議,主要功能包括,統計, 分析, 可視化, 監控,追蹤等,適合在微服務環 ...
  • 本文技術源自外企,並已在多個世界500強大型項目開發中運用。 本文適合有初/中級.NET知識的同學閱讀。(支持.NET/.NET Framework/.NET Core) RabbitMQ作為一款主流的消息隊列工具早已廣受歡迎。相比於其它的MQ工具,RabbitMQ支持的語言更多、功能更完善。 本文 ...
  • ApeForms系列① 快速上手 @ 前言 ApeForms是一套基於WinForm框架免費的UI庫,提供了豐富的Metro風格控制項、針對WinForm開發中常見類型的擴展、通用Dialog/Notification的模板等。 目前ApeForms仍在持續開發擴充更多的控制項,如果有好的建議可以在評論 ...
  • C#-WinForm窗體仿Android桌面(左右翻頁) 利用ApeForms擴展方法使控制項平滑運動,並以此實現一個仿Android桌面翻頁的效果。 ...
  • 本文大部分來自官方教程的Google翻譯 但是加了一點點個人的理解和其他相關知識 轉載請註明 原文鏈接 :https://www.cnblogs.com/Multya/p/16317401.html 官方教程: https://www.sfml-dev.org/tutorials/2.5/ 播放聲音 ...
  • 背景 項目裡面的yml文件為了區別線上、測試、本地環境,分別有application-prod.yml,application-dev.yml,application-local.yml;但是每個裡面有很多相同的配置,希望配置文件裡面的運維相關的公共配置抽取出來,統一管理 實現方案 通過在appli ...
  • 最近 JetBrains 為旗下系列 IDE 發佈了全新的預設 UI: IDEA 官宣全新預設 UI,太震撼了!! 不過現在還是預覽版,需要通過以下鏈接參與試用: https://www.jetbrains.com/lp/intellij-new-ui-preview/ 棧長昨天也提交了試用申請,還 ...
  • 在IDEA中將Javafx項目打包成為可運行的.jar文件。 使用JDK17.0.2。 ...
  • 在Spring項目中進行簡單的cglib動態代理的學習測試,主要代碼如下: 一個目標類HaveDinnerService public class HaveDinnerService { public String eat(String food) { System.out.println("開始吃 ...
  • 記錄一下使用springSecurity搭建用戶認證和授權的代碼、、、 技術棧使用springSecurity + redis + JWT + mybatisPlus 部分代碼來自:https://blog.csdn.net/I_am_Hutengfei/article/details/100561 ...