隨著我們對(duì)web前端編程開發(fā)技術(shù)的掌握,越來越多的框架語言和架構(gòu)方式被我們所熟知。
定興ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
下面廣州北大青鳥就一起來了解一下,web前端開發(fā)的一些常見框架結(jié)構(gòu)。
1.全包型這類框架大的特點(diǎn)就是從底層的渲染引擎、布局引擎,到中層的DSL,再到上層的框架全部由自己開發(fā),代表框架是Qt和Flutter。
這類框架優(yōu)點(diǎn)非常明顯:性能(的上限)高;各平臺(tái)渲染結(jié)果一致。
缺點(diǎn)也非常明顯:需要完全重新學(xué)習(xí)DSL(QML/Dart),以及難以適配中國(guó)特色的端:小程序。
這類框架是原始也是純正的的多端開發(fā)框架,由于底層到上層每個(gè)環(huán)節(jié)都掌握在自己手里,也能大可能地去保證開發(fā)和跨端體驗(yàn)一致。
但它們的框架研發(fā)成本巨大,渲染引擎、布局引擎、DSL、上層框架每個(gè)部分都需要大量人力開發(fā)維護(hù)。
2.Web技術(shù)型這類框架把Web技術(shù)(JavaScript,CSS)帶到移動(dòng)開發(fā)中,自研布局引擎處理CSS,使用JavaScript寫業(yè)務(wù)邏輯,使用流行的前端框架作為DSL,各端分別使用各自的原生組件渲染。
代表框架是ReactNative和Weex,這樣做的優(yōu)點(diǎn)有:開發(fā)迅速;復(fù)用前端生態(tài);易于學(xué)習(xí)上手,不管前端后端移動(dòng)端,多多少少都會(huì)一點(diǎn)JS、CSS。
缺點(diǎn)有:1.交互復(fù)雜時(shí)難以寫出高性能的代碼,這類框架的設(shè)計(jì)就必然導(dǎo)致JS和Native之間需要通信,類似于手勢(shì)操作這樣頻繁地觸發(fā)通信就很可能使得UI無法在16ms內(nèi)及時(shí)繪制。
ReactNative有一些聲明式的組件可以避免這個(gè)問題,但聲明式的寫法很難滿足復(fù)雜交互的需求。
2.由于沒有渲染引擎,使用各端的原生組件渲染,相同代碼渲染的一致性沒有一種高。
3.JavaScript編譯型這類框架就是我們這篇文章的主角們:Taro、WePY、uni-app、mpvue、chameleon,它們的原理也都大同小異:先以JavaScript作為基礎(chǔ)選定一個(gè)DSL框架,以這個(gè)DSL框架為標(biāo)準(zhǔn)在各端分別編譯為不同的代碼,各端分別有一個(gè)運(yùn)行時(shí)框架或兼容組件庫保證代碼正確運(yùn)行。
flutter很強(qiáng),目前一套代碼可以供Android,iOS, Web 使用,妥妥的一套代碼,多端使用,在跨平臺(tái)開發(fā)中,有著巨大的影響。
相對(duì)于iOS開發(fā),F(xiàn)lutter的布局更具有靈活性,每個(gè)頁面設(shè)計(jì)都不一樣,相同頁面可選擇的布局方式也不一樣,如果單純的說應(yīng)該如何去布局,我覺得不現(xiàn)實(shí),大家可以參考下 Flutter官方的布局教程 。接下來,筆者,通過項(xiàng)目中的一個(gè)頁面,來一步一步的拆解布局的流程。整個(gè)過程,基本上按照拆解、組件封裝、具體布局這三步來的。
根據(jù)設(shè)計(jì)圖,可以看出整體可以分成兩部分,上面一部分是系統(tǒng)介紹模塊,下面一部分是真正的登錄內(nèi)容,因?yàn)樯婕暗蒋B加,因此考慮用Stack;
系統(tǒng)介紹模塊部分:整體也是涉及到疊加,考慮用Stack,分為四部分。最底部漸變色背景用一個(gè)contanier,無須指定位置,全視圖擴(kuò)展;載放logo圖標(biāo)在上一層,用Image。最后兩個(gè)Text同級(jí)放在最上層。Image,Text各用Positioned包裹去指定位置。
登錄內(nèi)容模塊是最外層是一個(gè)Contanier容器,去控制背景色和圓角。然后是一個(gè)Column元素,逐行排列。
第一行為Image,
第二行為Text,
第三行可以看成一個(gè)小Column,分兩塊進(jìn)行布局
第四行可以看成一個(gè)小Column,分兩塊進(jìn)行布局
第五行可以看作一個(gè)TextButton,
第六行可以看作一個(gè)Row,分三塊進(jìn)行布局
通過上面這樣一步一步的分析后,基本上對(duì)大致的布局有了一個(gè)了解,最外層的控件大致選對(duì)(只要能實(shí)現(xiàn)的話,就是復(fù)雜度以及效率的問題),然后一步一步的拆解每一行的元素,如果有重復(fù)的或者覺得可以封裝出來的部分,則進(jìn)行下一步。
每一行的拆解,大致也是按照這個(gè)思路來進(jìn)行,因此筆者在這里就不做講解了。
在做到第三第四行的時(shí)候,發(fā)現(xiàn)這兩個(gè)很相似,而且設(shè)計(jì)到一些交互邏輯,筆者就想對(duì)第三第四行的這種展示進(jìn)行封裝,覺得今后的布局可能會(huì)用到,因此在這一步,可以先把這一塊兒抽離出一個(gè)控件。利用TextField來實(shí)現(xiàn)這種輸入操作,具體的實(shí)現(xiàn)筆者不再詳細(xì)的描述了。
經(jīng)過這一步,整體的規(guī)劃設(shè)計(jì)圖已經(jīng)有了,各個(gè)組件也都有了,接下來的工作就是組裝了。
具體布局設(shè)計(jì)到一些細(xì)節(jié)的地方,例如整體Column的居中對(duì)齊(crossAxisAlignment)、間隔(Padding或Container包裹,筆者更喜歡用SizedBox占位)、居左居右居中(Align)、點(diǎn)擊事件(GestureDetector)以及圓角(BorderRadius)等一些特殊情況。
像第六行row是放在底部的,就可以在第六行前面增加一個(gè)Spacer()去填充空白區(qū)域。
對(duì)文字顏色大小等,可以用TextStyle直接設(shè)置。
對(duì)于輸入框的刪除按鈕,可以用Offstage這種Flutter特有的控制顯示隱藏的控件。
作者:閑魚技術(shù)-國(guó)有
國(guó)有,閑魚架構(gòu)團(tuán)隊(duì)負(fù)責(zé)人。在7月13號(hào)落幕的2019年Archsummit峰會(huì)上就近一年來閑魚在FlutterFaaS一體化項(xiàng)目上的 探索 和實(shí)踐進(jìn)行了分享。
隨著無線,IoT的發(fā)展,5G的到來,移動(dòng)研發(fā)越發(fā)向多端化發(fā)展。傳統(tǒng)的基于Native+Web+服務(wù)端的開發(fā)方式,研發(fā)效率低下,顯然已經(jīng)無法適應(yīng)發(fā)展需要。
我們希望 探索 閑魚這樣規(guī)模的獨(dú)立APP的高效研發(fā)架構(gòu)。主要思路是圍繞Flutter解決多端問題,并使Flutter與FaaS等無服務(wù)容能力打通,形成云端一體化的研發(fā)能力,支持一云多端的發(fā)展需要。在某些場(chǎng)景已經(jīng)取得效果,希望分享過程中的思考,與大家交流。
閑魚選擇Flutter主要是出于高性能的考慮。Flutter高性能主要來源于2個(gè)原因:
更多比較:
沒有銀彈的解決方案,F(xiàn)lutter與RN各有優(yōu)點(diǎn)。如何選擇因素很多,關(guān)鍵看如何取舍,舉個(gè)例子:
云端技術(shù)棧的打通,是減少協(xié)同的不錯(cuò)的解法。以往前端+Node.js的一體化方案大家應(yīng)該不會(huì)陌生,然而如果端側(cè)使用了Flutter,那云側(cè)Dart自然是第一選擇。
FaaS的本質(zhì)是運(yùn)行在云端,那Dart適合用在云/Server上嗎?
Dart語言早于Flutter,在最初的設(shè)計(jì)上,Dart就可以用于Web、Server。Dart具備一些服務(wù)端語言的特點(diǎn):
閑魚首先嘗試將Dart作為普通的Server,替代傳統(tǒng)的Java Server,然后再將Dart容器嵌入到FaaS容器中。建立Dart Server能力是第一步,也是主要的工作量所在。
閑魚在Dart Server方面的建設(shè)思路:
開發(fā)期:
運(yùn)行期:
上述內(nèi)容實(shí)現(xiàn)了FlutterDart FaaS的技術(shù)棧的統(tǒng)一,但僅技術(shù)棧統(tǒng)一還遠(yuǎn)遠(yuǎn)不夠,端、云的同學(xué)仍然無法真正互補(bǔ)和一體化打通,原因在于還有更多深入問題需要考慮:
面向這些問題,閑魚的解法思路:
案例一,一體化在資源均衡方面的體現(xiàn)。在近期的一個(gè)項(xiàng)目中,云端一體化使原本2個(gè)月的項(xiàng)目時(shí)間,減少了20天。
案例二,一體化在業(yè)務(wù)閉環(huán)方面的體現(xiàn)。負(fù)責(zé)增長(zhǎng)的一位開發(fā)同學(xué),專注在增長(zhǎng)業(yè)務(wù)上,在合適的情況下為合適的人投放合適的內(nèi)容,以此帶來用戶的增長(zhǎng)和活躍效果。一體化的方式下,可以統(tǒng)一云、端的切面,業(yè)務(wù)研發(fā)不再受云、端的限制。
一體化是建設(shè)高效研發(fā)框架的方向,并不是所有場(chǎng)景都需要一體化的開發(fā),但一體化的Flutter、FaaS等技術(shù)組件,可以獨(dú)立使用,也會(huì)帶來效率提升,并且與原有的開發(fā)模式兼容。從一體化的思路去建設(shè),可以使整體架構(gòu)體系更加一致,也有機(jī)會(huì)做一體的架構(gòu)沉淀。
未來閑魚希望在一體化上做更多嘗試和深入 探索 ,包括一體化工具、一體化業(yè)務(wù)平臺(tái)、數(shù)據(jù)化智能化等方向。
下面這種情況下,為 InkWell 設(shè)置的 splashColor 不會(huì)生效:
需要用 Material 去除背景色,然后將顏色設(shè)置在 InkWell 外部:
在 Dialog builder 中使用 WillPopScope 禁用返回鍵返回:
注意:使用此方法同時(shí)也會(huì)禁用 iOS 上的手勢(shì)滑動(dòng)返回功能,推薦判斷平臺(tái)后再使用。
修改對(duì)話框中的復(fù)選框狀態(tài),最簡(jiǎn)便的方法是通過 Element 中的 markNeedsBuild 方法:
當(dāng)然,更推薦的做法是通過 StatefulBuilder ,然后就可以在 Dialog 中調(diào)用 setState 方法了,不過在調(diào)用 setState 時(shí)需要判斷 Dialog 是否已經(jīng)關(guān)閉,否則會(huì)造成 setState() called after dispose() 的錯(cuò)誤,可以通過添加一個(gè)標(biāo)志位來解決,如下:
在 Web 中加載網(wǎng)絡(luò)圖片有時(shí)會(huì)失敗,遇到這樣的報(bào)錯(cuò): Exception caught by image resource service... ,造成該錯(cuò)誤的原因通常是,圖片跨域了(見 跨域資源共享 )。最簡(jiǎn)單的解決辦法是, 使用 HTML 渲染加載 ,而不是默認(rèn)的 CanvasKit。
Flutter 中所有的 list 默認(rèn)都是沒有 ScrollBar 的,必須使用 ScrollBar 組件。ScrollBar 組件通過監(jiān)聽 ScrollView 的 ScrollNotification 來刷新位置,所以 List 的長(zhǎng)度必須是固定的。
當(dāng)使用 WebView 等高度不定的組件時(shí)會(huì)出現(xiàn)內(nèi)容被截?cái)嗟那闆r,通常可以使用 NestedScrollView 來解決該問題,需要在 WebView 外部嵌套 SingleChildScrollView。
雖然使用了緩存,而且也是用 builder 加載圖片的,但是發(fā)現(xiàn)一個(gè)現(xiàn)象:滑動(dòng)屏幕后圖片短暫消失并重新加載了。圖片高度很高時(shí)這種現(xiàn)象更加明顯,其原因是超出屏幕范圍一定距離的組件被重新渲染了。解決方法是在 ListView 上設(shè)置 cacheExtent 參數(shù):
該參數(shù)的作用是改變超出屏幕高度后繼續(xù)渲染的范圍(以像素為單位),比如設(shè)置成 9999 后意味著超出屏幕 10000 像素以內(nèi)的內(nèi)容都會(huì)被保留下來。
借助 IntrinsicHeight 組件:
另外,IntrinsicHeight 還可以用于 Dialog 或者 BottomSheet 中,使得其中的元素 顯示內(nèi)在元素的高度 ,從而避免元素因?yàn)榧s束的存在而不顯示或者高度太高(比如在使用了 Column 或者 Row 的時(shí)候)。
在通過 Uri 的 queryParameters 獲取 query 參數(shù)時(shí),發(fā)現(xiàn)有些鏈接會(huì)拋出下面異常:
造成該異常的原因是 Uri 默認(rèn)使用 utf-8 解碼超鏈接字符串,如果鏈接中包含非 utf-8 字符,就會(huì)造成上面的錯(cuò)誤,相關(guān) issue 見: issue #31621 。目前該 issue 處于 open 的狀態(tài),暫時(shí)的解決辦法是,在所有使用到 queryParameter 的地方用 try..catch 捕捉可能拋出的異常。
Flutter 開發(fā)非常依賴各種官方或第三方的插件,而在使用這些插件時(shí)多少都會(huì)遇到一些問題,大部分問題都可以通過搜索和查找 issue 來解決。這里記錄下一些我在使用部分插件時(shí)遇到的問題及其解決方法。
目前該庫沒有圖片加載完成的回調(diào)(見 issue #545 ),不過我們可以通過在 imageBuilder 中來添加回調(diào):
這是一個(gè)應(yīng)用內(nèi)更新插件,安卓 10 以上安裝時(shí)需要在 manifest 中添加以下內(nèi)容:
目前功能最強(qiáng)大的 WebView 插件,基本能滿足絕大部分移動(dòng)端網(wǎng)頁加載的需求,而且可定制化程度高。
一般通過 CookieManager 修改 Cookie,攔截請(qǐng)求并修改請(qǐng)求對(duì)象的 Header 不會(huì)生效。
InAppWebViewOptions 的 userAgent 只在 iOS 上生效,而 applicationNameForUserAgent 只在 Android 上生效,所以最好的做法是分平臺(tái)設(shè)置 InAppWebViewOptions ,而且需要注意,由于設(shè)置 userAgent 后會(huì)覆蓋默認(rèn)的 UserAgent,所以如果需要在默認(rèn)的 UserAgent 上添加其它參數(shù),iOS 上需要通過 InAppWebViewController.getDefaultUserAgent() 獲取默認(rèn) UserAgent 參數(shù),而 Android 不需要添加。
如果圖片源或者請(qǐng)求是 http 的,為了在 Android 上正常加載請(qǐng)求,必須在 AndroidInAppWebViewOptions 中將 mixedContentMode 設(shè)置為 AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW 。
當(dāng)我們想要設(shè)置全屏圖片的時(shí)候,由于默認(rèn)的 Constraint 會(huì)將圖片居中顯示,所以圖片四周會(huì)留有空隙。為了去除這個(gè)限制,我們需要 Xcode 中打開 LaunchScreen.storyboard,然后在 View Controller 的 View 和 LaunchImage 上的 Safe Area 去掉。
具體設(shè)置方法:右側(cè) Inspector 面板 Show the Size inspector 解選 Layout Margins 中的 Safe Area Relative Margins,拖動(dòng)圖片占滿全屏,然后根據(jù) View Controller Scene 的 Warning,更新 Constraint 就可以了。
在集成某些三方庫之后,在使用命令行運(yùn)行 iOS 模擬器的時(shí)候可能會(huì)遇到下面這個(gè)報(bào)錯(cuò):
這是因?yàn)?iOS 模擬器未來將會(huì)兼容 arm64 架構(gòu),但是目前還不支持,所以我們需要修改 Build Setting 使得能夠在 x86_64 的模擬器上運(yùn)行,操作步驟見 這里 。
本文名稱:flutter多端開發(fā),純flutter開發(fā)
URL網(wǎng)址:http://chinadenli.net/article28/dsdssjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、企業(yè)網(wǎng)站制作、商城網(wǎng)站、虛擬主機(jī)、、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)