新建一個(gè)Flutter工程,android模塊。
成都創(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)境。為雙鴨山企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都做網(wǎng)站,雙鴨山網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1,只有一個(gè)Activity組件,它是Dart層繪制Widget的容器。
2,Application配置FlutterApplication。
應(yīng)用Application配置io.flutter.app.FlutterApplication類,App首次啟動(dòng)時(shí),初始化。
調(diào)用FlutterMain.startInitialization()方法。
initConfig方法,從AndroidManfest.xml配置的applicaion節(jié)點(diǎn)獲取meta-data數(shù)據(jù),初始化以下默認(rèn)值。
這些值都是使用中用到的name,例如,抽取apk中asset資源時(shí),flutter_assets打包目錄,打包產(chǎn)物data名稱。
initResources方法, 初始化資源。
在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項(xiàng),將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。
/data/user/0/包名/app_flutter目錄。
在目錄中創(chuàng)建一個(gè)時(shí)間戳文件,根據(jù)apk版本和包信息記錄的lastUpdateTime更新時(shí)間,第二次啟動(dòng)時(shí),若apk未更新,不需要再次抽取。
加載so庫(kù),libflutter.so,System.loadLibrary()。
主頁(yè)面繼承FlutterActivity,配置啟動(dòng)模式singleTop。
FlutterActivity類在io.flutter.app包, (區(qū)別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類。
組件啟動(dòng),onCreate方法。
FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創(chuàng)建FlutterView視圖(io.flutter.view),繼承SurfaceView類,setContentView方法,設(shè)置組件主布局即FlutterView視圖。
最后,根據(jù)Bundle路徑,runBundle()加載運(yùn)行,
調(diào)用FlutterView的runFromBundle方法,入口點(diǎn)在dart的main方法,
通過(guò)FlutterNativeView,調(diào)用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道遠(yuǎn)
標(biāo)準(zhǔn)的Flutter App工程,包含標(biāo)準(zhǔn)的Dart層與Native平臺(tái)層
Flutter平臺(tái)插件工程,包含Dart層與Native平臺(tái)層的實(shí)現(xiàn)
Flutter純Dart插件工程,僅包含Dart層的實(shí)現(xiàn),往往定義一些公共Widget
參考資料:
在flutter官網(wǎng)上推薦了iOS項(xiàng)目中兩種混編方式:
筆者在采用兩種集成方式的過(guò)程中,因?yàn)閕OS項(xiàng)目結(jié)構(gòu)設(shè)計(jì)導(dǎo)致這兩種簡(jiǎn)單的集成方式都有些麻煩,所以在實(shí)踐中更改和優(yōu)化了集成方式,使之在筆者的項(xiàng)目中能夠更加簡(jiǎn)單和快速的集成。
問(wèn)題:在不更改flutter tool中相關(guān)腳本的前提下,添加的Script Phase中的腳本相對(duì)路徑錯(cuò)誤,如果只是開(kāi)發(fā),手動(dòng)更改下路徑就可以了,但是在考慮到CI中不能每次在pod install之后都去更改,所以在開(kāi)發(fā)調(diào)試中采用該集成方式,結(jié)合flutter attach的方式去調(diào)試。
通過(guò)編譯相關(guān)的 xcframework + Cocoapods私有庫(kù)的集成方式在CI中集成,這樣QA的CI不需要配置flutter的相關(guān)依賴
根據(jù)flutter編譯工具的提示: 上面的編譯命令是打包flutter工程項(xiàng)目和插件的產(chǎn)物,在實(shí)際開(kāi)發(fā)過(guò)程中可以發(fā)現(xiàn)是否引入了依賴Native的插件會(huì)導(dǎo)致貶義編譯產(chǎn)物的不同。
根據(jù)上面的對(duì)比:
第一部分:基礎(chǔ)的 Flutter Engine + Flutter App 編譯后的產(chǎn)物 Flutter.xcframwork -- Flutter引擎的包 App.xcframework -- 工程項(xiàng)目對(duì)應(yīng)的AOT的編譯產(chǎn)物 第二部分:三方插件的注冊(cè)中心 FlutterPluginRegistrant.xcframework -- 第三方插件的注冊(cè)中心,其實(shí)是Native + iOS通信的集合 第三部分:依賴iOS Native的原生 FMDB . xcframwork path_provider_ios.xcframework sqflite.xcframework -- cached_network_image依賴的原生實(shí)現(xiàn)
根據(jù)上面的編譯產(chǎn)物可以知道Flutter和App是編譯后必有的包,后面的兩個(gè)部分完全是服務(wù)于三方插件的,到這可以解答第二個(gè)問(wèn)題:筆者App的混編過(guò)程中混編插件失效是因?yàn)楣P者在NativeApp中重寫(xiě)了Flutter的容器,使用了FlutterEngineGroup動(dòng)態(tài)創(chuàng)建多引擎去對(duì)應(yīng)進(jìn)入不同的功能模塊,混合插件是因?yàn)橹貙?xiě)過(guò)程中沒(méi)有通過(guò)GeneratedPluginRegistrant注冊(cè)插件,所以需要在Native的Flutter容器中注冊(cè)插件,使之生效。
在這為什么使用commit的hash作為flutter-libs的依賴,因?yàn)閜od install的時(shí)候會(huì)有緩存,除了版本好,commit hash也能保證每次CI編譯通過(guò) pod install 來(lái)更新flutter-libs依賴產(chǎn)物
完成!?。?/p>
新聞名稱:flutter工程化,Flutter工程化
文章鏈接:http://sd-ha.com/article16/hoosgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、ChatGPT、微信小程序、外貿(mào)建站、網(wǎng)站排名、網(wǎng)站內(nèi)鏈
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)