十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
Flutter只是 谷歌的移動(dòng) UI 框架,在Android開(kāi)發(fā)中,你可以理解為 嵌套在activity里面的一個(gè)view即可。
專(zhuān)注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)保德免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
目前有純flutter開(kāi)發(fā),還有 flutter,原生混合開(kāi)發(fā) 兩種模式。。
在Flutter中,我們可以使用Image控件來(lái)顯示圖片,一般來(lái)講我們的圖片資源都來(lái)源于網(wǎng)絡(luò)或者本地圖片。
Flutter中的Image也是類(lèi)似。
我們先來(lái)看看Image的構(gòu)造方法
下面我們來(lái)看看其常用的屬性
可以看到,其常用屬性跟前端中的css很像。
下面我們來(lái)簡(jiǎn)單用一用Image控件
首先是必填參數(shù)image,它接收一個(gè)ImageProvider類(lèi)型的值。ImageProvider是一個(gè)抽象類(lèi),他下面有下圖這些實(shí)現(xiàn)類(lèi),由下面這些實(shí)現(xiàn)類(lèi)可以看出,image是可以從資源,內(nèi)存,網(wǎng)絡(luò),和文件中獲取圖片。
我們先來(lái)試試加載網(wǎng)絡(luò)圖片
首先看看NetworkImage構(gòu)造方法,很簡(jiǎn)單,傳個(gè)url就可以了
如下:
嗯,就是這么簡(jiǎn)單。其他3種情況使用也是類(lèi)似的,自行看源碼即可。
實(shí)際上,F(xiàn)lutter給我們提供了擴(kuò)展方法,使用起來(lái)更加簡(jiǎn)單,通常我們直接使用提供的擴(kuò)展方法即可
如下
可以看到,他們的構(gòu)造方法基本類(lèi)似。
所以我們也可以這樣寫(xiě),跟上面的效果是一致的。
大致分為一下幾步
1.創(chuàng)建一個(gè)文件夾,用于存放圖片,如圖,我創(chuàng)建了一個(gè)imgs的文件夾,放了一張圖片
2.在pubspec.yaml中聲明資源,注意聲明的時(shí)候路徑和前面的-是有間隔的,不然的話會(huì)報(bào)#/properties/flutter/properties/assets: type: wanted [array] got -imgs/code.png
類(lèi)似的錯(cuò)誤,聲明完成后點(diǎn)擊右上方的packages get
或
下面我們?cè)賮?lái)看看其他屬性。
width,height
寬高沒(méi)什么好說(shuō)的,就是設(shè)置寬度和高度
配合color使用,用于設(shè)置顏色的混合模式。BlendMode是一個(gè)枚舉,他有很多值
詳細(xì)解析還是看官方文檔吧,值太多了,我們隨便用用
用于設(shè)置圖片的填充方式,當(dāng)圖片本身小于設(shè)置的寬高或者比父控件的寬高小時(shí),我們可以設(shè)置該屬性控制圖片的顯示。
其值的類(lèi)型是BoxFit。是個(gè)枚舉
具體含義還是直接看文檔即可
設(shè)置圖片的對(duì)齊方式,接收一個(gè)Alignment類(lèi)型的值,值如下,很好理解
為了方便看效果我們?cè)谕膺吿琢藗€(gè)Container,簡(jiǎn)單的把它理解為一個(gè)容器布局就可以了,類(lèi)似于html中的div或android中的Layout,我們給Container設(shè)置了寬高和背景顏色。
bottomLeft效果如下,其他的自行嘗試
相對(duì)于Image,ICON可以像web一樣使用字體圖標(biāo),并且可以使用矢量圖,無(wú)需擔(dān)心失真的問(wèn)題,并且體積相對(duì)較小。
我們先來(lái)看看其構(gòu)造方法
很簡(jiǎn)單,我們直接來(lái)用一用
默認(rèn)情況下,pubspec.yaml中uses-material-design的值為true.我們默認(rèn)就可以使用Material Design字體圖標(biāo)
Uniapp目前比較成熟,而且用的是Vue語(yǔ)法,學(xué)習(xí)成本比較低,而且行業(yè)里面用的也比較廣泛,而Flutter的話,學(xué)習(xí)成本略高,因?yàn)橐獙W(xué)習(xí)新的語(yǔ)言,還有就是目前生態(tài)不是特別完備,等他再發(fā)展發(fā)展吧。黑馬程序員官網(wǎng)有成套免費(fèi)視頻哦,有什么不懂的可以直接過(guò)去學(xué)習(xí)。您的采納是對(duì)我成長(zhǎng)的鞭策
跨終端移動(dòng)開(kāi)發(fā)是近期準(zhǔn)備總結(jié)的一個(gè)主題,作為這一系列的開(kāi)始,首先簡(jiǎn)單說(shuō)說(shuō)基于WebView的Hybrid混合開(kāi)發(fā)模式。
有過(guò)混合應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)的同學(xué),對(duì)基于WebView的Hybrid開(kāi)發(fā)模式應(yīng)該不會(huì)陌生。借助于原生端各平臺(tái)的WebView組件,可以實(shí)現(xiàn)Native和JavaScript的雙向通信,從而將Web App與Mobile App融合起來(lái),開(kāi)啟混合開(kāi)發(fā)的新模式。
基于WebView的Hybrid開(kāi)發(fā)模式到如今已經(jīng)非常成熟,不再是一個(gè)實(shí)驗(yàn)性新技術(shù),而是廣泛應(yīng)用在各大廠商的平臺(tái)型應(yīng)用如微信、手Q中。
JSBridge作為連接Native和JavaScript的橋梁,是基于WebView的Hybrid開(kāi)發(fā)模式中的關(guān)鍵點(diǎn)。
在了解其通信原理后,再來(lái)看JSBridge究竟是什么。從前端角度來(lái)看,可能會(huì)把JSBridge理解為業(yè)務(wù)開(kāi)發(fā)過(guò)程中,以全局變量注入到WebView中,幫助調(diào)用原生API的JavaScript工具庫(kù)。這樣的理解不夠準(zhǔn)確,按照我的理解,JSBridge不是一個(gè)標(biāo)準(zhǔn)的規(guī)范,基于原生系統(tǒng)為WebView組件提供的能力,已經(jīng)可以建立起WebView JavaScript bridge,即使不再做更高程度的封裝,也可以完成從Native到JavaScript的雙向通信了。
我們所說(shuō)的JSBridge,是對(duì)底層通道的抽象封裝,這一過(guò)程包括了原生和JavaScript兩側(cè)內(nèi)容,在原生端需要考慮系統(tǒng)API差異,對(duì)上層調(diào)用提供統(tǒng)一接口,在JavaScript端需要考慮調(diào)用方式,請(qǐng)求管理等內(nèi)容。JSBridge的設(shè)計(jì)實(shí)現(xiàn)已經(jīng)是成熟技術(shù)了,其設(shè)計(jì)可以參考 In-depth Profiling of JSBridge 、 Hybrid APP架構(gòu)設(shè)計(jì)思路 ,一個(gè)安卓端完整JSBridge實(shí)現(xiàn)可以參考 JsBridge實(shí)現(xiàn) 。
目前,基于WebView的Hybrid開(kāi)發(fā)模式非常成熟,廣泛應(yīng)用于各類(lèi)平臺(tái)型App中。實(shí)現(xiàn)一個(gè)完善的JSBridge是在現(xiàn)有App中集成使用Hybrid開(kāi)發(fā)模式的基礎(chǔ),在完成這一基礎(chǔ)設(shè)施建設(shè)后,大家繼續(xù)在各個(gè)方向深挖,在不同的維度不斷優(yōu)化性能和體驗(yàn)。
多數(shù)App的Hybrid部分做到上面部分,已經(jīng)有了還不錯(cuò)的體驗(yàn)。在我的了解中,空間團(tuán)隊(duì)在上面基礎(chǔ)上繼續(xù)優(yōu)化給出的是當(dāng)前做的更好的方案。其主要流程如下圖所示,詳細(xì)內(nèi)容可以參考 QQ空間前端工程師如何做首屏優(yōu)化
除了在現(xiàn)有App中集成使用這一開(kāi)發(fā)模式,還可以使用這一技術(shù)開(kāi)發(fā)獨(dú)立App。早期的PhoneGap、Cordova、現(xiàn)在的Ionic,是這一領(lǐng)域較為知名的開(kāi)發(fā)框架。
我司前端技術(shù)棧曾以Angular為主,一些App也由前端團(tuán)隊(duì)基于Angular技術(shù)棧選型Ionic。初入團(tuán)隊(duì)曾維護(hù)過(guò)基于Angular 1.x的Ionic App,用于我司投資顧問(wèn)服務(wù)客戶的以IM為主、綜合一些其他業(yè)務(wù),可以算一個(gè)比較復(fù)雜的應(yīng)用。
前端技術(shù)背景的同學(xué),采用Ionic框架開(kāi)發(fā)App的學(xué)習(xí)成本不高。開(kāi)發(fā)過(guò)程中仍在沿用前端技術(shù),寫(xiě)的仍是Web App,跑在原生WebView容器中。采用Ionic提供的組件庫(kù),可以快速搭建項(xiàng)目界面。其擴(kuò)展原生的機(jī)制也比較方便,如有原生能力的需求,并且沒(méi)有現(xiàn)成實(shí)現(xiàn)的,可以自行封裝使用,不過(guò)這個(gè)過(guò)程就需要原生開(kāi)發(fā)同學(xué)的參與了。在我們的上述App開(kāi)發(fā)中,主要是安卓端消息推送模塊由原生開(kāi)發(fā)同學(xué)提供了支持,其余對(duì)原生能力的需求如拍照、相冊(cè)訪問(wèn)等常見(jiàn)需求,都有現(xiàn)成方案。
然而,采用Ionic完成上述應(yīng)用,也有明顯不足的地方。首先是聊天列表方面,我們知道,如微信和QQ聊天窗口,這是一個(gè)異構(gòu)的無(wú)限滾動(dòng)長(zhǎng)列表,在進(jìn)入聊天界面時(shí),一般只加載最近的一屏聊天數(shù)據(jù),然后通過(guò)滾動(dòng)加載歷史消息。在原生端完成這一需求有各種常見(jiàn)手段,而僅靠Web端技術(shù),在各種折騰后,效果都不盡如人意。其次是動(dòng)畫(huà),這里的動(dòng)畫(huà)包括了換頁(yè)動(dòng)畫(huà)和其他動(dòng)畫(huà),流暢程度一般。最后是前端開(kāi)發(fā)通病,要處理瀏覽器兼容性問(wèn)題,crosswalk只是一個(gè)理論解決方案,其體積限制了幾乎不會(huì)被采用。
Ionic不斷迭代,新的版本中依賴(lài)新的Angular。新的Angular與Angular 1.x開(kāi)發(fā)體驗(yàn)已經(jīng)完全不同,如果你還不了解,可以閱讀我們團(tuán)隊(duì)書(shū)籍 揭秘Angular 2 。新的Ionic的開(kāi)發(fā)體驗(yàn),相比以往也有提升,在其工具鏈中,提供了拖拽式項(xiàng)目生成工具
同時(shí),Ionic pro提供的開(kāi)發(fā)者工具,為應(yīng)用整個(gè)生命周期提供了完善的支持平臺(tái),包括了以下功能,不過(guò),使用需要付費(fèi)。
站在當(dāng)下來(lái)看,對(duì)于前端技術(shù)背景開(kāi)發(fā)者來(lái)說(shuō),如果已有Angular基礎(chǔ),不希望引入過(guò)高學(xué)習(xí)成本,需要快速開(kāi)發(fā)一個(gè)復(fù)雜程度不算太高、或者對(duì)應(yīng)用性能不是特別敏感的跨終端App,選擇Ionic依然是一個(gè)可行方案。
然而,既然你已經(jīng)身在前端領(lǐng)域這樣一個(gè)技術(shù)更迭日新月異的圈子里,還是應(yīng)該使勁的折騰,關(guān)注跨端開(kāi)發(fā)這個(gè)主題新的技術(shù)熱點(diǎn),接下來(lái)我也會(huì)繼續(xù)談?wù)勗贜ativeScript、React Native、Flutter的一些體驗(yàn),可以保持關(guān)注。
最近項(xiàng)目中要集成flutter來(lái)進(jìn)行混編,但是在集成后,突然遇到一個(gè)很神奇的問(wèn)題,在debug模式下,用數(shù)據(jù)線連接真機(jī)打包可以打開(kāi)flutter頁(yè)面,但是一旦拔掉數(shù)據(jù)線,再打開(kāi)flutter頁(yè)面就不行了,開(kāi)始以為是因?yàn)閒lutterSDK的原因,但是一查資料才發(fā)現(xiàn),原來(lái)是因?yàn)閐ebug模式下flutter實(shí)現(xiàn)了熱重載,默認(rèn)的編譯方式是JIV,但是iOS14+之后的系統(tǒng)限制了JIV這種編譯方式,所以連接X(jué)code重新run一個(gè)release包就可以了,因?yàn)閒lutter在release模式下的編譯方式是AOT,iOS14+的系統(tǒng)是支持這種編譯方式的,具體解決方案如下圖
再運(yùn)行就可以了。
當(dāng)然還有另外一種解決方案,就是修改flutter的編譯配置,強(qiáng)制設(shè)為release