新聞中心
flutter在initState中顯示Dialog加載框
Future.delayed(Duration.zero, () {
成都創(chuàng)新互聯(lián)公司主營延平網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,手機APP定制開發(fā),延平h5重慶小程序開發(fā)搭建,延平網(wǎng)站營銷推廣歡迎延平等地區(qū)企業(yè)咨詢
showDialog(
context: context,
barrierDismissible: false,
builder: (_) {
return LoadingDialog();
});
});
Flutter 124: 日常問題小結(jié) (三) 自定義 Dialog 二三事
針對日常不同的需求,我們時常需要自定義 Dialog ,而小菜在嘗試過程中遇到一些小問題,簡單記錄總結(jié)一下;
小菜在自定義含有文本框的 Dialog 時,文本框獲取焦點時,軟鍵盤會部分遮擋對話框,但當小菜替換為 AlertDialog 時,文本框獲取焦點時,對話框會向上浮動,避免軟鍵盤遮擋;
對于含有文本框的自定義 Dialog ,小菜在最外層使用的是 Material 嵌套,小菜通過采用 Scaffold 來嵌套處理,默認 Scaffold 中 resizeToAvoidBottomPadding / resizeToAvoidBottomInset 為 true ,當設(shè)置為 false 時,文本框獲取焦點時,依舊會被軟鍵盤遮擋;因為在固定情景可以配合 resizeToAvoidBottomPadding 實現(xiàn)是否被軟鍵盤遮擋效果;
resizeToAvoidBottomPadding 主要用于自身 Widget 是否避免被其他窗口遮擋;其中小菜查資料介紹在 Flutter 1.1.9 之后更推薦使用 resizeToAvoidBottomInset ;
小菜自定義一個可以多選 item 的 Dialog ,但 Dialog 中并沒有狀態(tài)更新的 State ,如何進行 Dialog 中狀態(tài)更新呢?
小菜之前在 showDialog 時直接創(chuàng)建了 TypeListDialog ,此時是無狀態(tài)的,當 WidgetBuilder 創(chuàng)建一個 StatefulBuilder 有狀態(tài)的構(gòu)造器即可,可以將 state 傳遞到 Dialog 中;
小菜在自定義 Dialog 時如何在一個回調(diào)方法中傳遞多個參數(shù)?
小菜在 Dialog 的回調(diào)方法中傳遞兩個 List ,而在接收回調(diào)方法中匹配兩個參數(shù)即可;小菜簡單看作是一個函數(shù)方法;
小菜在重寫 AppBar 時,如何取消默認的返回按鈕?
取消 AppBar 前面的返回圖標有多種方式;
自定義 Dialog 案例源碼
小菜對于 Flutter 的應(yīng)用還不夠熟悉,很多常用的場景會處理的很不到位,小菜會對日常的小問題進行簡單記錄,逐步學習;如有錯誤,請多多指導!
flutter中關(guān)于軟鍵盤彈起導致的問題
原因:在flutter中,鍵盤彈起時系統(tǒng)會縮小Scaffold的高度并重建
1)把Scaffold的resizeToAvoidBottomInset屬性設(shè)置為false,這樣在鍵盤彈出時將不會resize
2)把寫死的高度改為 原高度 - MediaQuery.of(context).viewInsets.bottom ,鍵盤彈出時布局將重建,而這個 MediaQuery.of(context).viewInsets.bottom 變量在鍵盤彈出前是0,鍵盤彈起后的就是鍵盤的高度
將輸入框放進可滾動的Widget中即可,當輸入框獲取焦點后,系統(tǒng)會自動將它滑動到可視區(qū)域
Flutter 22: 圖解 PopupMenu 那些事兒
小菜需要處理標題欄彈出對話框 PopupMenu 樣式, Flutter 當然提供了一些處理方式,類似 PopupMenuEntry 等,小菜僅就最基礎(chǔ)的使用方式進行初步的學習和整理。
PopupMenuItem 為單個 item 的彈出樣式,默認為 48px 高,可根據(jù)需求自行定義。 item 中可以自定義需要的樣式,包括文字圖片等一系列樣式。
Tips: 若需要處理帶圖標的樣式時,官網(wǎng)提供的 Demo 是借助的 ListTile 來處理的,但是小菜測試發(fā)現(xiàn)圖標與文字距離偏大,原因在于 ListTile 默認左側(cè)圖標 leading 距離不可直接調(diào)整,建議用 Row 或其他方式調(diào)整。
CheckedPopupMenuItem 是一個帶有復(fù)選標記的彈出菜單項。默認高度同樣是 48px ,水平布局使用 ListTile 復(fù)選標記是 Icons.done 圖標,顯示在 leading 位置;同時只有在狀態(tài)為選中時才會顯示圖標。
PopupMenuDivider 是一條水平分割線,注意數(shù)組要使用父類 PopupMenuEntry ,配合其他 item 樣式共同使用。 PopupMenuDivider 可以調(diào)整高度,但無法調(diào)整顏色,有需要的話可以進行自定義。
PopupMenu 默認的彈框位置都是在右上角,且會擋住標題欄,如果有需要在其他位置彈框就需要借助 showMenu ,主要通過 position 屬性定位彈框位置。
menu 的寬高與內(nèi)容相關(guān),小菜的理解是在水平和豎直方向上會將設(shè)置的 position 位置加上 menu 寬高,再與屏幕匹配,超過屏幕寬高,根據(jù) position 按照 LTRB 順序貼近屏幕邊框展示。
Tips: 如果 item 個數(shù)過多也無需擔心,F(xiàn)lutter 支持默認超過屏幕滑動效果。
小菜目前的學習還僅限于基本的使用,稍高級的自定義涉及較少,如果又不對的地方還希望多多指出。
flutter 鍵盤彈出時list view 置底
1、點擊輸入flutter框彈出軟鍵盤時,遮擋本輸入框一部分。
2、點擊輸入框,輸入框跟隨軟鍵盤自動上移時其他不該移動的內(nèi)容也跟隨上移導致的flutter鍵盤彈出時listview置底。
Flutter中showDialog()后關(guān)閉Dialog
在耗時操作的時候,一般都要彈出一個加載框,然后在完成的時候再把加載框關(guān)掉,在Flutter中可以直接用showDialog()來彈出一個對話框。
這是一個簡單的提示對話框,包含了關(guān)閉按鈕,點擊就能關(guān)閉。但一般的耗時操作完成,就需要我們自己把dialog關(guān)閉掉。
首先,開啟dialog的時機。由于我們需要獲取到BuildContext,所以就得等build()方法走完,這里可以用Future.delayed()來等創(chuàng)建好BuildContext再進行創(chuàng)建,或者用Timer來延遲操作,我選擇了前者。
其中delayed()在initState()結(jié)尾來做就行,這里參考網(wǎng)友封裝了一個LoadingDialog。
那么接下來要在什么時機關(guān)閉呢?
一開始,我理所當然的以為,是在異步方法結(jié)束后,去更新界面的時候關(guān)閉,也就是setState(() {})的時候,可是不管怎么嘗試,用Navigator.pop()不行,用Navigator.of(context, rootNavigator: true).pop(result)也不行,用FlutterBoost.singleton.close(id)也不行,用FlutterBoost.singleton.closeCurrent()也不行,都會直接把非Dialog的頁面也關(guān)閉掉,這讓我百思不得其解,因為showDialog()的本質(zhì)也是新建了一個Route出來,也就是最頂層的頁面是彈出的Dialog,可是為什么關(guān)不掉呢。
一番思前想后,把showDialog的邏輯移到和異步邏輯同級,也就是setState(() {})外面,然后把showDialog()自身創(chuàng)建的BuildContext傳進去就能正常關(guān)閉了。也就是,在setState(() {})的時候,其實用的context還是非Dialog頁面的,所以關(guān)閉的當然就不是Dialog了。
持有Dialog自己的BuildContext,然后在異步以后調(diào)用就行了。
文章名稱:flutter彈出窗,flutter 打開文件
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/dsdsdhj.html