針對日常不同的需求,我們時常需要自定義 Dialog ,而小菜在嘗試過程中遇到一些小問題,簡單記錄總結(jié)一下;
在奉節(jié)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),奉節(jié)網(wǎng)站建設(shè)費用合理。
小菜在自定義含有文本框的 Dialog 時,文本框獲取焦點時,軟鍵盤會部分遮擋對話框,但當(dāng)小菜替換為 AlertDialog 時,文本框獲取焦點時,對話框會向上浮動,避免軟鍵盤遮擋;
對于含有文本框的自定義 Dialog ,小菜在最外層使用的是 Material 嵌套,小菜通過采用 Scaffold 來嵌套處理,默認(rèn) Scaffold 中 resizeToAvoidBottomPadding / resizeToAvoidBottomInset 為 true ,當(dāng)設(shè)置為 false 時,文本框獲取焦點時,依舊會被軟鍵盤遮擋;因為在固定情景可以配合 resizeToAvoidBottomPadding 實現(xiàn)是否被軟鍵盤遮擋效果;
resizeToAvoidBottomPadding 主要用于自身 Widget 是否避免被其他窗口遮擋;其中小菜查資料介紹在 Flutter 1.1.9 之后更推薦使用 resizeToAvoidBottomInset ;
小菜自定義一個可以多選 item 的 Dialog ,但 Dialog 中并沒有狀態(tài)更新的 State ,如何進(jìn)行 Dialog 中狀態(tài)更新呢?
小菜之前在 showDialog 時直接創(chuàng)建了 TypeListDialog ,此時是無狀態(tài)的,當(dāng) WidgetBuilder 創(chuàng)建一個 StatefulBuilder 有狀態(tài)的構(gòu)造器即可,可以將 state 傳遞到 Dialog 中;
小菜在自定義 Dialog 時如何在一個回調(diào)方法中傳遞多個參數(shù)?
小菜在 Dialog 的回調(diào)方法中傳遞兩個 List ,而在接收回調(diào)方法中匹配兩個參數(shù)即可;小菜簡單看作是一個函數(shù)方法;
小菜在重寫 AppBar 時,如何取消默認(rèn)的返回按鈕?
取消 AppBar 前面的返回圖標(biāo)有多種方式;
自定義 Dialog 案例源碼
小菜對于 Flutter 的應(yīng)用還不夠熟悉,很多常用的場景會處理的很不到位,小菜會對日常的小問題進(jìn)行簡單記錄,逐步學(xué)習(xí);如有錯誤,請多多指導(dǎo)!
可以使用 SingleChildScrollView 包裹布局
這里還需要了解一個 Scaffold 中的一個屬性 resizeToAvoidBottomInset
官方文檔給出的解釋就是處理鍵盤遮擋問題,默認(rèn)是 true,如果不希望頂起需要設(shè)置為 false。
在 sdk 低版本的時候是使用 resizeToAvoidBottomPadding 需要將其設(shè)置為 false,現(xiàn)在已經(jīng)棄用。但網(wǎng)上很多文章還沒有改正,仍然用的 resizeToAvoidBottomPadding。
分兩種情況
一種是使用系統(tǒng)的返回鍵,比如 android 底部導(dǎo)航自帶的返回,
另一種是使用導(dǎo)航欄自定義的返回鍵
第一種情況需要在頁面根布局使用 WillPopScope 在 onWillPop 中攔截返回處理。
原理都是通過判斷輸入框是否獲取了焦點
當(dāng)?shù)撞坑泄潭ǖ慕M件,比如提交按鈕,我們在鍵盤彈起的時候希望按鈕貼著鍵盤頂部固定,但是中間滾動視圖可以自由滾動
可以在 SingleChildScrollView 外部再使用 Stack 包裹,懸浮按鈕使用 Positioned 定位,
還要??注意要給滾動組件底部留出距離防遮擋,同時還有動態(tài)加上 bottomBar 的高度,因為在 iphoneX 以上的手機,會有個虛擬按鍵,如果不加上該按鍵高度,同樣會被遮擋
高度獲取方法: MediaQuery.of(context).padding.bottom
在 showDialog 布局中使用 Scaffold 包裹,不要忘了將 backgroundColor 設(shè)為透明。
如果彈窗過高,還是需要將高度固定,然后使用 SingleChildScrollView ,彈窗中同樣也可以在執(zhí)行關(guān)閉的時候攔截,判斷鍵盤是否彈起,如果彈起則要先關(guān)閉鍵盤。
給所有輸入框綁定 FoucusNode
在 maxLines=1 的情況下,輸入框不支持換行,換行按鈕會變成 done
監(jiān)聽 onEditingComplete 方法
根布局使用 GestureDetector 或者 InkWell 包裹,點擊的時候收起鍵盤。
最后要記得銷毀
當(dāng)dialog里需要輸入框彈出軟鍵盤時,會造成遮擋問題
首先應(yīng)該考慮用Scaffold當(dāng)根布局將其背景設(shè)置為透明色
然后包裹Center 使dialog全屏居中
最后包裹自己的dialog內(nèi)容
2017年底因公司業(yè)務(wù)組合部門調(diào)整,新的團(tuán)隊部分維護(hù)的項目用React Native技術(shù)混合開發(fā)。為適應(yīng)環(huán)境變化,開啟瘋狂RN學(xué)習(xí)之旅,晚上回來啃資料看視頻??赡苡捎诒旧韺N技術(shù)體驗不感冒或者在環(huán)境之下強迫學(xué)習(xí)有點不爽。開始尋找代替方案,F(xiàn)luter像一束曙光引起了我的注意,之后一直關(guān)注并利用閑余時間開始探索。2018年一直學(xué)習(xí)到使用Flutter寫項目,從0.2.0開始到現(xiàn)在1.5版本的發(fā)布,終于開始慢慢的爬出坑位了,但是因為部分控件感覺還是不如原生控件好用,因而Flutter提供了PlatformView部件。近期因項目中嚴(yán)重使用依賴地圖,故而做了Fluterr使用原生IOS高德地圖調(diào)研。因為我本身是一名android開發(fā)人員,初學(xué)IOS并記錄下來。
PlatformView是 flutter 官方提供的一個可以嵌入 Android 和 iOS 平臺原生 view 的小部件。
在我們實際開發(fā)中,我們遇到一些 flutter 官方?jīng)]有提供的插件可以自己創(chuàng)建編寫插件來實現(xiàn)部分功能,但是原生View在 flutter 中會遮擋住flutter 中的小部件,比如你想使用高德地圖sdk、視頻播放器、直播等原生控件,就無法很好的與 flutter 項目結(jié)合。
1、info.plist文件設(shè)置
2、 ios 端實現(xiàn)原生組件PlatformView提供原生view
3 、ios 端創(chuàng)建PlatformViewFactory用于生成PlatformView
4、 ios 端創(chuàng)建FlutterPlugin用于注冊原生組件
5 、flutter 平臺嵌入 原生view
iOS端的UiKitView目前還只是preview狀態(tài), 默認(rèn)是不支持的, 需要手動打開開關(guān), 在info.plist文件中新增一行io.flutter.embedded_views_preview為true.
創(chuàng)建類 FlutterMapView 并實現(xiàn)FlutterPlatformView 協(xié)議
FlutterMapView.h
FlutterMapView.m
FlutterMapFactory.h
FlutterMapFactory.m
FlutterMapPlugin.h
FlutterMapPlugin.m
請前往 高德開放平臺控制臺 申請 iOS Key。
注意:Bundle Identifier需要與申請的時候填寫的一致
地圖依賴的庫列舉如下:
基礎(chǔ) SDK AMapFoundationKit.framework
第一步:將解壓后的MAMapKit.framework 文件 copy 或 拖拽 到工程文件夾中,左側(cè)目錄選中工程名,在 TARGETS-Build Phases- Link Binary With Libaries 中點擊“+”按鈕,在彈出的窗口中點擊“Add Other”按鈕,選擇工程目錄下的 MAMapKit.framework 文件添加到工程中。
千萬不要忘記將AMapFoundationKit也一起加入工程。
3D地圖正確配置應(yīng)如下圖所示:
需要引入的資源文件包括:AMap.bundle,其中:AMap.bundle 在 MAMapKit.framework 包中,AMap.bundle資源文件中存儲了定位、默認(rèn)大頭針標(biāo)注視圖等圖片,可利用這些資源圖片進(jìn)行開發(fā)。
左側(cè)目錄中選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從MAMapKit.framework中選擇AMap.bundle文件,并勾選“Copy items if needed”復(fù)選框,單擊“Add”按鈕,將資源文件添加到工程中。
成功跑起來 。。 。
默認(rèn)的appbar下方會自帶一個陰影效果。
要去掉這個陰影的話需要在appbar中設(shè)置:
核心的思想就是在column中使用expend包裹一次然后child使用listView,這樣的話輸入框被聚焦的時候鍵盤就會把頁面頂上去。
1、點擊輸入flutter框彈出軟鍵盤時,遮擋本輸入框一部分。
2、點擊輸入框,輸入框跟隨軟鍵盤自動上移時其他不該移動的內(nèi)容也跟隨上移導(dǎo)致的flutter鍵盤彈出時listview置底。