?
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為豐鎮(zhèn)企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè),豐鎮(zhèn)網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
在 Google I/O ’17 上,Google 向我們介紹了Flutter —— 一款新的用于創(chuàng)建移動(dòng)應(yīng)用的開(kāi)源庫(kù)。
正如你所想的那樣,F(xiàn)lutter 是能夠幫助創(chuàng)建擁有漂亮 UI 界面的跨平臺(tái)移動(dòng)應(yīng)用解決方案。Flutter 的界面設(shè)計(jì)與 web 應(yīng)用類似,因此,你能夠從 Flutter 上找到像使用 HTML/CSS 那樣熟悉的感覺(jué)。
Google 表示:Flutter 將會(huì)幫你更容易,更快速的開(kāi)發(fā)出界面美觀的移動(dòng)應(yīng)用。
聽(tīng)起來(lái)很美好,但是首先要說(shuō)的是,我對(duì)其他跨平臺(tái)解決方案,諸如 Xamarin,PhoneGap,Cordova,React Native,weex, ionic等并不是很認(rèn)可。 大家都知道,這些解決方案互有利弊,很難選擇。雖然我并不確定 Flutter 是否會(huì)與它們有所不同,但是我很期待。
Flutter 在 移動(dòng) 前端開(kāi)發(fā)上具有很多特色,很有吸引力。這篇文章,我將會(huì)告訴大家我之所以喜歡 Flutter 的真正原因,我們現(xiàn)在就開(kāi)始吧!
為什么要用 Flutter ?
你可能會(huì)好奇,然后問(wèn)自己一個(gè)問(wèn)題:
Flutter 有什么創(chuàng)新之處?它是如何工作的?與 React Native 有什么不同之處?
簡(jiǎn)要來(lái)說(shuō),F(xiàn)lutter 是一個(gè)移動(dòng) SDK ,允許我們創(chuàng)建跨平臺(tái)移動(dòng)應(yīng)用(這樣你就可以編寫一份代碼,在 Android 和 iOS 都可以運(yùn)行這個(gè)應(yīng)用程序)。你使用dart 語(yǔ)言編寫代碼,這是一種由谷歌開(kāi)發(fā)的語(yǔ)言,如果你以前用過(guò) Java ,那看它會(huì)覺(jué)得非常熟悉。你不再需要用 XML 文件構(gòu)建布局樹(shù),而是像這樣:
好的,現(xiàn)在就開(kāi)始吧!
1、熱重載
我們從一個(gè)基本的應(yīng)用開(kāi)始。我們有三個(gè)按鈕,它們中的每一個(gè)都能改變文本的顏色:
出現(xiàn)此情況的原因有兩種
解決:
找到 \app\src\main\res\drawable\launch_background.xml 文件,這個(gè)里面初始化了布局標(biāo)簽,只需要把圖片替換為我們自己的就可以。
或者根據(jù)不同手機(jī)的分辨率 在mipmap下放置圖片例如:
之后前往 styles.xml 文件設(shè)置啟動(dòng)頁(yè)
重新打包就可以看到 剛剛設(shè)置的啟動(dòng)頁(yè)了
效果例如:
[圖片上傳失敗...(image-7e5c2-1586668143446)]
至此可以流暢的打開(kāi)啟動(dòng)頁(yè)了
如果我們目前的項(xiàng)目是Android的,但是接下來(lái)我們希望部分頁(yè)面可以使用Flutter進(jìn)行開(kāi)發(fā),甚至我們希望在Native頁(yè)面中嵌入FlutterUI組件,那么我們?cè)撊绾螌?shí)現(xiàn)呢?
假設(shè)你現(xiàn)在Android項(xiàng)目的目錄的結(jié)構(gòu)是這樣的
這時(shí)候如果你想創(chuàng)建一個(gè)Flutter模塊,使得Android模塊和Flutter模塊之間可以進(jìn)行交互,我們可以通過(guò)Android Studio新建一個(gè)Flutter Module,具體過(guò)程是:File — New — New Module ,之后選擇Flutter Module,指定Project Location的路徑為
也就是說(shuō),最終你的項(xiàng)目結(jié)構(gòu)會(huì)是這樣的
接下來(lái)在Android Module的 build.gradle 文件中添加flutter依賴
先創(chuàng)建一個(gè)Flutter頁(yè)面
這里比較重要的是 window.defaultRouteName 這個(gè)字段,這個(gè)字段可以接收從Native傳遞過(guò)來(lái)的參數(shù) (下文我們會(huì)介紹原生傳遞參數(shù)的方法),也就是說(shuō)通過(guò)這個(gè)字段我們就可以進(jìn)行Flutter頁(yè)面的路由的分發(fā)
我們可以直接在Android的 MainActivity 中啟動(dòng)一個(gè) FlutterActivity ,這里的 initialRoute 方法中傳遞的參數(shù)就對(duì)應(yīng)Flutter層的 window.defaultRouteName
注意:需要在 AndroidManifest.xml 注冊(cè) FlutterActivity
自己創(chuàng)建一個(gè) FlutterAppActivity 繼承自 FlutterActivity
在 MainActivity 中啟動(dòng) FlutterAppActivity (另外別忘了在 AndroidManifest.xml 中注冊(cè) FlutterAppActivity )
兩種啟動(dòng)方式的區(qū)別
如果單純只是想打開(kāi)一個(gè)Flutter頁(yè)面,兩種方式實(shí)際上基本沒(méi)有太大區(qū)別,第一種方式也許還會(huì)更簡(jiǎn)單一點(diǎn)。但是,在Flutter開(kāi)發(fā)中,我們往往還需要開(kāi)發(fā)一些Native插件供Flutter調(diào)用,如果使用復(fù)寫 FlutterActivity 的方式更有利于我們?cè)?FlutterActivity 中注冊(cè)我們的Native插件,所以實(shí)際開(kāi)發(fā)中一般推薦使用第二種方式
擴(kuò)展思考
initialRoute 從名稱上看起來(lái)是Flutter提供給我們進(jìn)行Native與Flutter交互的路由跳轉(zhuǎn)的,但是實(shí)際上他就是一個(gè)字符串,我們不僅僅可以傳遞一個(gè)路由名稱,有時(shí)候我們也可以通過(guò)這個(gè)參數(shù)傳遞一串JSON數(shù)據(jù),然后在Flutter端進(jìn)行解析,這樣我們就可以通過(guò)這個(gè)參數(shù)做更多的事情
activity_main.xml
FrameLayout 用于承載Flutter組件
MainActivity.java
使用 FragmentManager 將 FlutterFragment 添加到 FrameLayout 容器中
運(yùn)行結(jié)果
上半部分是原生的TextView,下半部分是Flutter的Text組件
本節(jié)主要介紹了Native和Flutter之間的頁(yè)面跳轉(zhuǎn),以及同一個(gè)頁(yè)面中Native與Flutter組件的組合。接下來(lái)會(huì)介紹如何編寫Android插件與Flutter進(jìn)行數(shù)據(jù)交互