此框架旨在將常規(guī)的Flutter項目中使用到的通用(與業(yè)務(wù)無關(guān))的功能從剝離出來,構(gòu)成Flutter開發(fā)項目的框架,在開發(fā)新的Flutter項目時,可以直接引用本項目 import 'package:framework/framework.dart' 來使用框架中相關(guān)的功能,提升開發(fā)效率。 github項目地址
創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為科爾沁左翼企業(yè)提供專業(yè)的網(wǎng)站制作、成都網(wǎng)站建設(shè),科爾沁左翼網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
此框架目前包含以下功能模塊:接口請求API模塊、消息提示模塊、路由模塊、統(tǒng)一錯誤處理、日志模塊、屏幕適配測試、自定義UI組件庫、本地存儲模塊構(gòu)成
[img]下面這種情況下,為 InkWell 設(shè)置的 splashColor 不會生效:
需要用 Material 去除背景色,然后將顏色設(shè)置在 InkWell 外部:
在 Dialog builder 中使用 WillPopScope 禁用返回鍵返回:
注意:使用此方法同時也會禁用 iOS 上的手勢滑動返回功能,推薦判斷平臺后再使用。
修改對話框中的復(fù)選框狀態(tài),最簡便的方法是通過 Element 中的 markNeedsBuild 方法:
當然,更推薦的做法是通過 StatefulBuilder ,然后就可以在 Dialog 中調(diào)用 setState 方法了,不過在調(diào)用 setState 時需要判斷 Dialog 是否已經(jīng)關(guān)閉,否則會造成 setState() called after dispose() 的錯誤,可以通過添加一個標志位來解決,如下:
在 Web 中加載網(wǎng)絡(luò)圖片有時會失敗,遇到這樣的報錯: Exception caught by image resource service... ,造成該錯誤的原因通常是,圖片跨域了(見 跨域資源共享 )。最簡單的解決辦法是, 使用 HTML 渲染加載 ,而不是默認的 CanvasKit。
Flutter 中所有的 list 默認都是沒有 ScrollBar 的,必須使用 ScrollBar 組件。ScrollBar 組件通過監(jiān)聽 ScrollView 的 ScrollNotification 來刷新位置,所以 List 的長度必須是固定的。
當使用 WebView 等高度不定的組件時會出現(xiàn)內(nèi)容被截斷的情況,通??梢允褂?NestedScrollView 來解決該問題,需要在 WebView 外部嵌套 SingleChildScrollView。
雖然使用了緩存,而且也是用 builder 加載圖片的,但是發(fā)現(xiàn)一個現(xiàn)象:滑動屏幕后圖片短暫消失并重新加載了。圖片高度很高時這種現(xiàn)象更加明顯,其原因是超出屏幕范圍一定距離的組件被重新渲染了。解決方法是在 ListView 上設(shè)置 cacheExtent 參數(shù):
該參數(shù)的作用是改變超出屏幕高度后繼續(xù)渲染的范圍(以像素為單位),比如設(shè)置成 9999 后意味著超出屏幕 10000 像素以內(nèi)的內(nèi)容都會被保留下來。
借助 IntrinsicHeight 組件:
另外,IntrinsicHeight 還可以用于 Dialog 或者 BottomSheet 中,使得其中的元素 顯示內(nèi)在元素的高度 ,從而避免元素因為約束的存在而不顯示或者高度太高(比如在使用了 Column 或者 Row 的時候)。
在通過 Uri 的 queryParameters 獲取 query 參數(shù)時,發(fā)現(xiàn)有些鏈接會拋出下面異常:
造成該異常的原因是 Uri 默認使用 utf-8 解碼超鏈接字符串,如果鏈接中包含非 utf-8 字符,就會造成上面的錯誤,相關(guān) issue 見: issue #31621 。目前該 issue 處于 open 的狀態(tài),暫時的解決辦法是,在所有使用到 queryParameter 的地方用 try..catch 捕捉可能拋出的異常。
Flutter 開發(fā)非常依賴各種官方或第三方的插件,而在使用這些插件時多少都會遇到一些問題,大部分問題都可以通過搜索和查找 issue 來解決。這里記錄下一些我在使用部分插件時遇到的問題及其解決方法。
目前該庫沒有圖片加載完成的回調(diào)(見 issue #545 ),不過我們可以通過在 imageBuilder 中來添加回調(diào):
這是一個應(yīng)用內(nèi)更新插件,安卓 10 以上安裝時需要在 manifest 中添加以下內(nèi)容:
目前功能最強大的 WebView 插件,基本能滿足絕大部分移動端網(wǎng)頁加載的需求,而且可定制化程度高。
一般通過 CookieManager 修改 Cookie,攔截請求并修改請求對象的 Header 不會生效。
InAppWebViewOptions 的 userAgent 只在 iOS 上生效,而 applicationNameForUserAgent 只在 Android 上生效,所以最好的做法是分平臺設(shè)置 InAppWebViewOptions ,而且需要注意,由于設(shè)置 userAgent 后會覆蓋默認的 UserAgent,所以如果需要在默認的 UserAgent 上添加其它參數(shù),iOS 上需要通過 InAppWebViewController.getDefaultUserAgent() 獲取默認 UserAgent 參數(shù),而 Android 不需要添加。
如果圖片源或者請求是 http 的,為了在 Android 上正常加載請求,必須在 AndroidInAppWebViewOptions 中將 mixedContentMode 設(shè)置為 AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW 。
當我們想要設(shè)置全屏圖片的時候,由于默認的 Constraint 會將圖片居中顯示,所以圖片四周會留有空隙。為了去除這個限制,我們需要 Xcode 中打開 LaunchScreen.storyboard,然后在 View Controller 的 View 和 LaunchImage 上的 Safe Area 去掉。
具體設(shè)置方法:右側(cè) Inspector 面板 Show the Size inspector 解選 Layout Margins 中的 Safe Area Relative Margins,拖動圖片占滿全屏,然后根據(jù) View Controller Scene 的 Warning,更新 Constraint 就可以了。
在集成某些三方庫之后,在使用命令行運行 iOS 模擬器的時候可能會遇到下面這個報錯:
這是因為 iOS 模擬器未來將會兼容 arm64 架構(gòu),但是目前還不支持,所以我們需要修改 Build Setting 使得能夠在 x86_64 的模擬器上運行,操作步驟見 這里 。
Flutter教程全套 (全網(wǎng)獨家)百度網(wǎng)盤免費資源在線學習 ?
鏈接:
提取碼: m9z8 ?
Flutter教程全套 (全網(wǎng)獨家)
第一套:Flutter 攜程17章全-整理好
第五套:Flutter高仿谷歌翻譯項目課程
第四套:兩小時掌握Flutter移動App開發(fā)視頻
第三套:flutter入門到精通全套
第七套:Flutter小實戰(zhàn)20個
第六套:仿直聘boss的flutter完整教程
第九套:Flutter跨平臺開發(fā)
第二套:flutter移動電商實戰(zhàn)-技術(shù)胖
第八套:Flutter基礎(chǔ)教程(基礎(chǔ)不好的優(yōu)先看)
24Flutter的打包.mp4
23靜態(tài)資源和項目圖片的處理.mp4
22頁面跳轉(zhuǎn)并返回數(shù)據(jù)_.mp4
21導(dǎo)航的參數(shù)傳遞和接受-2_.mp4
20導(dǎo)航的參數(shù)傳遞和接受-1.mp4
目前感覺要extends View不好用。 listview的一些擴展(Loadmore)不方便,其他的都很ok。
相對于iOS開發(fā),F(xiàn)lutter的布局更具有靈活性,每個頁面設(shè)計都不一樣,相同頁面可選擇的布局方式也不一樣,如果單純的說應(yīng)該如何去布局,我覺得不現(xiàn)實,大家可以參考下 Flutter官方的布局教程 。接下來,筆者,通過項目中的一個頁面,來一步一步的拆解布局的流程。整個過程,基本上按照拆解、組件封裝、具體布局這三步來的。
根據(jù)設(shè)計圖,可以看出整體可以分成兩部分,上面一部分是系統(tǒng)介紹模塊,下面一部分是真正的登錄內(nèi)容,因為涉及到疊加,因此考慮用Stack;
系統(tǒng)介紹模塊部分:整體也是涉及到疊加,考慮用Stack,分為四部分。最底部漸變色背景用一個contanier,無須指定位置,全視圖擴展;載放logo圖標在上一層,用Image。最后兩個Text同級放在最上層。Image,Text各用Positioned包裹去指定位置。
登錄內(nèi)容模塊是最外層是一個Contanier容器,去控制背景色和圓角。然后是一個Column元素,逐行排列。
第一行為Image,
第二行為Text,
第三行可以看成一個小Column,分兩塊進行布局
第四行可以看成一個小Column,分兩塊進行布局
第五行可以看作一個TextButton,
第六行可以看作一個Row,分三塊進行布局
通過上面這樣一步一步的分析后,基本上對大致的布局有了一個了解,最外層的控件大致選對(只要能實現(xiàn)的話,就是復(fù)雜度以及效率的問題),然后一步一步的拆解每一行的元素,如果有重復(fù)的或者覺得可以封裝出來的部分,則進行下一步。
每一行的拆解,大致也是按照這個思路來進行,因此筆者在這里就不做講解了。
在做到第三第四行的時候,發(fā)現(xiàn)這兩個很相似,而且設(shè)計到一些交互邏輯,筆者就想對第三第四行的這種展示進行封裝,覺得今后的布局可能會用到,因此在這一步,可以先把這一塊兒抽離出一個控件。利用TextField來實現(xiàn)這種輸入操作,具體的實現(xiàn)筆者不再詳細的描述了。
經(jīng)過這一步,整體的規(guī)劃設(shè)計圖已經(jīng)有了,各個組件也都有了,接下來的工作就是組裝了。
具體布局設(shè)計到一些細節(jié)的地方,例如整體Column的居中對齊(crossAxisAlignment)、間隔(Padding或Container包裹,筆者更喜歡用SizedBox占位)、居左居右居中(Align)、點擊事件(GestureDetector)以及圓角(BorderRadius)等一些特殊情況。
像第六行row是放在底部的,就可以在第六行前面增加一個Spacer()去填充空白區(qū)域。
對文字顏色大小等,可以用TextStyle直接設(shè)置。
對于輸入框的刪除按鈕,可以用Offstage這種Flutter特有的控制顯示隱藏的控件。