雖然 Flutter 的成長(zhǎng)曲線和未來前景看起來都很好,但不可否認(rèn)的是,目前 Flutter 仍處在發(fā)展階段,很多大型互聯(lián)網(wǎng)企業(yè)都無法毫無顧慮地讓全線 App 接入,而其中最主要的顧慮是包大小與動(dòng)態(tài)化。
動(dòng)態(tài)化代表著更短的需求上線路徑,代表著大大壓縮了原始包的大小,從而獲得更高的用戶下載意向,也代表著更健全的線上質(zhì)量維護(hù)體系。當(dāng)明白這些意義后,我們也就不難理解,在 Flutter 的應(yīng)用與適配趨近完善時(shí),動(dòng)態(tài)化自然就成為了一個(gè)無法避開的話題。RN 和 Weex 等成熟技術(shù)甚至讓大家認(rèn)為動(dòng)態(tài)化是跨端技術(shù)的標(biāo)配。
一、什么是動(dòng)態(tài)化?
目前移動(dòng)端應(yīng)用的版本更新, 最常見的方式是定期發(fā)版,無論是安卓還是iOS,都需要提交新的安裝包到應(yīng)用市場(chǎng)進(jìn)行審核。審核通過后,用戶在應(yīng)用市場(chǎng)進(jìn)行App的下載更新。而動(dòng)態(tài)化, 就是不依賴更新程序安裝包, 就能動(dòng)態(tài)實(shí)時(shí)更新頁面的技術(shù)。
二、動(dòng)態(tài)化的必要性
為什么需要?jiǎng)討B(tài)化技術(shù)呢? 因?yàn)樯鲜龆ㄆ诎l(fā)版更新應(yīng)用的方式存在一些問題,比如:
1、審核周期長(zhǎng), 且可能審核不通過。 周期長(zhǎng)導(dǎo)致發(fā)版本不夠靈活, 緊急的業(yè)務(wù)需求不能及時(shí)上線。
2、線上出現(xiàn)急需修復(fù)的bug時(shí),需要較長(zhǎng)修復(fù)周期,影響用戶體驗(yàn)。
3、安裝包過大, 動(dòng)輒幾十兆幾百兆的應(yīng)用升級(jí)可能會(huì)讓用戶比較抗拒。
4、即使上線了,也無法達(dá)到全部用戶升級(jí), 服務(wù)端存在兼容多版本App的問題。
三、Flutter的動(dòng)態(tài)化可以通過在Flutter應(yīng)用程序中集成可編程的UI組件來實(shí)現(xiàn),例如將Dart代碼作為字符串從服務(wù)器端下載并評(píng)估,從而生成新的UI元素。下面是一些設(shè)計(jì)思路和代碼實(shí)現(xiàn):
1、使用Flutter的自定義渲染器(Custom Renderer):您可以編寫一個(gè)自定義渲染器,該渲染器將解析從服務(wù)器或其他來源下載的UI描述,并使用Flutter Framework API構(gòu)建UI元素。這種方法需要更多的開發(fā)工作,但它提供了更大的靈活性和控制權(quán)。
2、使用Flutter Widget樹序列化:Flutter Widget樹可以序列化為JSON格式,并可以發(fā)送到移動(dòng)設(shè)備上的Flutter應(yīng)用程序。您可以使用此功能,從遠(yuǎn)程服務(wù)器下載UI樹并將其反序列化為真實(shí)的Flutter組件樹。
3、使用Flutter插件:在Flutter中,插件是一個(gè)獨(dú)立的、客戶端庫,在Flutter應(yīng)用程序中運(yùn)行。您可以編寫一個(gè)插件,使其可以從云服務(wù)器下載所有UI元素并展示給用戶
四、實(shí)現(xiàn)思路
按道理iOS上也可以采取跟Android同樣的思路,但是由于蘋果開發(fā)者協(xié)議的規(guī)定,不允許動(dòng)態(tài)更新、運(yùn)行可執(zhí)行代碼;所以在Flutter資源的處理上,我們可以采用同Android一樣的思路,但是對(duì)代碼的處理,我們需要尋找新的方案;仡欀暗倪@些跨端方案,我們可以參照RN的實(shí)現(xiàn),只不過N不再是Native了,而是Flutter。RN是通過JS控制Native渲染,我們要實(shí)現(xiàn)的是通過JS控制Flutter渲染。
五、Flutter發(fā)展前景
隨著移動(dòng)應(yīng)用市場(chǎng)的不斷擴(kuò)大,跨平臺(tái)開發(fā)框架的需求也越來越大。Flutter框架可以幫助開發(fā)者在不同平臺(tái)上快速開發(fā)高質(zhì)量的移動(dòng)應(yīng)用程序,這種趨勢(shì)將進(jìn)一步推動(dòng)Flutter的發(fā)展和普及。
作為一名Android開發(fā)工程師,學(xué)習(xí)Flutter框架是非常有必要的。因?yàn)楝F(xiàn)在的前端開發(fā)已經(jīng)不僅僅局限于網(wǎng)頁開發(fā),而是需要涉及到多個(gè)平臺(tái)的應(yīng)用開發(fā)。如果掌握了Flutter框架的開發(fā)技能,就可以更好地滿足前端開發(fā)的多樣化需求。
從19年過去的幾年時(shí)間,F(xiàn)lutter在Google帶領(lǐng)各大廠商的引領(lǐng)下,飛速發(fā)展。flutter sdk官方也在快速的迭代升級(jí),從1.0到現(xiàn)在的3.1,從底層引擎到適配層再到框架層都有比較大的更新。
六、Flutter動(dòng)態(tài)化解決方案的兩種方法:
1. 熱重載(Hot Reload):
熱重載是Flutter框架的一項(xiàng)獨(dú)特功能,它允許開發(fā)者在應(yīng)用運(yùn)行時(shí)快速預(yù)覽代碼更改的效果,而無需重新啟動(dòng)整個(gè)應(yīng)用。熱重載使開發(fā)人員可以實(shí)時(shí)查看界面、布局和功能等變化,并立即在應(yīng)用中看到這些變化的效果。
2. 插件化(Flutter Plugin):
插件化是一種在Flutter應(yīng)用中集成動(dòng)態(tài)化插件的方法,可以在應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)加載新的功能模塊或代碼。開發(fā)人員可以編寫自定義插件,將其集成到應(yīng)用中,以實(shí)現(xiàn)動(dòng)態(tài)化更新和擴(kuò)展功能的目的。
七、動(dòng)態(tài)化方案調(diào)研
在Flutter實(shí)踐層面,簡(jiǎn)單來說分為三個(gè)流派:
方案一:JavaScript是最好的語言( 碰瓷PHP) 主要思路:利用Flutter做渲染,開發(fā)使用js,邏輯層通過v8/jscore解釋運(yùn)行。代表框架是騰訊的MXFlutter。這個(gè)框架是開源的,大寫的 。
方案二:DSL + JS
主要思路:基于模板實(shí)現(xiàn)動(dòng)態(tài)化,主要布局層采用Dart轉(zhuǎn)DSL的方式,邏輯層使用JS。代表框架是58同城開源的Fair。
方案三:布局,邏輯,一把梭
主要思路:與方案一最主要的區(qū)別是,邏輯層也是使用dart,增加了一層語法解析和運(yùn)行時(shí)。有一個(gè)代表,美團(tuán)的MTFlutter,然而沒有開源動(dòng)向,無從考察更多。