通過module的形式將flutter嵌入已有的ios項目中后,打包發(fā)布時可能會遇到報 Flutter.framework包含了x86_64框架問題,出現(xiàn)這個問題基本是因為粗心。
成都創(chuàng)新互聯(lián)公司為客戶提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設計、程序、域名、空間一條龍服務,提供基于WEB的系統(tǒng)開發(fā). 服務項目涵蓋了網(wǎng)頁設計、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、成都手機網(wǎng)站制作等網(wǎng)站方面業(yè)務。
怎么構建flutter module項目這里不提了,官方和網(wǎng)上博客都有。為了在已有的ios項目中嵌入flutter項目需要在ios項目中新建 Run Script Phase然后添加腳本:
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
官方文檔中明確寫道?drag the new build phase to just after the Target Dependencies phase
網(wǎng)上其他相關博客基本也會有寫這一點,意思是把新建的那個Run Script Phase拖到Target Dependencies phase下面,只有確保這個就不會有x86_64的問題。
當時遇到這個問題還研究了老半天,根據(jù)別人的博客還加了移除Flutter.framework中x86_64框架的腳本,然后我加了這個腳本也是沒有效果,沒有效果的原因也是這個順序的問題,同樣的拖到Target Dependencies phase下面也是會生效的(順序對的話就不需要額外添加移除x86_64的腳本)。
當時構建項目的時候看到說要拖到Target Dependencies phase下面,我理解的是新建的要在Target Dependencies phase下面而不能在它上面,然后新建一個Run Script Phase默認就是在最下面所有也就沒管了,但是其實這個順序是有講究的,分先后執(zhí)行,其他腳本都執(zhí)行完了,項目都已經打包好了,你最后再去執(zhí)行腳本處理Flutter.framework當然是沒有效果的
所以還是要有一個嚴謹?shù)膽B(tài)度,不要太隨意
如果我們目前的項目是Android的,但是接下來我們希望部分頁面可以使用Flutter進行開發(fā),甚至我們希望在Native頁面中嵌入FlutterUI組件,那么我們該如何實現(xiàn)呢?
假設你現(xiàn)在Android項目的目錄的結構是這樣的
這時候如果你想創(chuàng)建一個Flutter模塊,使得Android模塊和Flutter模塊之間可以進行交互,我們可以通過Android Studio新建一個Flutter Module,具體過程是:File — New — New Module ,之后選擇Flutter Module,指定Project Location的路徑為
也就是說,最終你的項目結構會是這樣的
接下來在Android Module的 build.gradle 文件中添加flutter依賴
先創(chuàng)建一個Flutter頁面
這里比較重要的是 window.defaultRouteName 這個字段,這個字段可以接收從Native傳遞過來的參數(shù) (下文我們會介紹原生傳遞參數(shù)的方法),也就是說通過這個字段我們就可以進行Flutter頁面的路由的分發(fā)
我們可以直接在Android的 MainActivity 中啟動一個 FlutterActivity ,這里的 initialRoute 方法中傳遞的參數(shù)就對應Flutter層的 window.defaultRouteName
注意:需要在 AndroidManifest.xml 注冊 FlutterActivity
自己創(chuàng)建一個 FlutterAppActivity 繼承自 FlutterActivity
在 MainActivity 中啟動 FlutterAppActivity (另外別忘了在 AndroidManifest.xml 中注冊 FlutterAppActivity )
兩種啟動方式的區(qū)別
如果單純只是想打開一個Flutter頁面,兩種方式實際上基本沒有太大區(qū)別,第一種方式也許還會更簡單一點。但是,在Flutter開發(fā)中,我們往往還需要開發(fā)一些Native插件供Flutter調用,如果使用復寫 FlutterActivity 的方式更有利于我們在 FlutterActivity 中注冊我們的Native插件,所以實際開發(fā)中一般推薦使用第二種方式
擴展思考
initialRoute 從名稱上看起來是Flutter提供給我們進行Native與Flutter交互的路由跳轉的,但是實際上他就是一個字符串,我們不僅僅可以傳遞一個路由名稱,有時候我們也可以通過這個參數(shù)傳遞一串JSON數(shù)據(jù),然后在Flutter端進行解析,這樣我們就可以通過這個參數(shù)做更多的事情
activity_main.xml
FrameLayout 用于承載Flutter組件
MainActivity.java
使用 FragmentManager 將 FlutterFragment 添加到 FrameLayout 容器中
運行結果
上半部分是原生的TextView,下半部分是Flutter的Text組件
本節(jié)主要介紹了Native和Flutter之間的頁面跳轉,以及同一個頁面中Native與Flutter組件的組合。接下來會介紹如何編寫Android插件與Flutter進行數(shù)據(jù)交互
1、創(chuàng)建MyFlutterView繼承NSObject并遵守FlutterPlatformView協(xié)議
2、實現(xiàn)自定義初始化方法,并實現(xiàn)?FlutterPlatformView協(xié)議方法
上文中 介紹了Linux平臺下Flutter環(huán)境搭建和桌面應用開發(fā),現(xiàn)在需要更深入了解如何將該應用運行在Linux系統(tǒng)的嵌入式設備上。
安裝及示例
在 ~/.bashrc 中配置 export PATH=$PATH:/opt/flutter-elinux/bin
打開weston虛擬機,此時發(fā)現(xiàn) flutter-elinux devices 連接設備變成兩個,如下圖
即可編譯及運行基于wayland顯示后端的demo
避坑
通過以下命令解決
執(zhí)行完畢后,F(xiàn)lutter module將會創(chuàng)建在ios項目/my_flutter目錄下
將Flutter模塊嵌入到現(xiàn)有iOS應用程序中有兩種方式:
此方法需要所有的相關開發(fā)的人員安裝 Flutter 環(huán)境。
需要在my_flutter文件夾下執(zhí)行一下
把.ios和.android等flutter配置生成出來。
AppDelegate.h:
AppDelegate.m:
控制器:
flutter:
注冊路由
通過全局FlutterEngine實例化FlutterViewController,并setInitialRoute設置初始化路由,這里發(fā)現(xiàn)設置的初始化路由路由并不管用
控制器:
設置FlutterViewController的pushRoute
這里其實只是讓flutter方面push一次
新建一個FlutterViewController并把setInitialRoute設置為跳轉的路由,不通過全局的FlutterEngine創(chuàng)建
放一個之前自己學習時寫的demo,希望可以幫助新入門的老鐵們,有好的建議可以提一下,我們一起進步,奧利給?。。?/p>
為什么我們要選擇flutter語言呢?它有哪些優(yōu)點呢?
*1.flutter將會幫你更容易,更快速的開發(fā)出界面美觀的移動應用。
*2.是谷歌的親兒子
*3.支持熱重載 :android原生開發(fā)會遇到編譯-打包-安裝三個步驟。開發(fā)效率遲遲得不到提升。熱重載技術在flutter內完美體現(xiàn)。
*4.支持垮平臺:flutter基于圖像回執(zhí)引擎進行渲染,在不同平臺下繪制效果絕對是一致的,能做到真正的跨平臺,一處寫,處處運行。
*5.性能優(yōu)異性:不同于H5通過DOM渲染和RN映射組件,flutter直接基于native進行繪制。性能上完全超過原生。
*1.Dart語法編譯:Dart是一種強類型、跨平臺的客戶端開發(fā)語言。具有專門為客戶端優(yōu)化、高生產力、快速高效、可移植易學的風格。Dart主要由谷歌負責開發(fā)和維護。
*2.Flutter插件:Flutter使用的Dart語言無法直接調用iOS系統(tǒng)提供的OC或swift接口,這時就需要使用插件來實現(xiàn)中轉。Flutter官方提供了豐富的原生接口封裝
Flutter分為三大部分
*1.由Dart語言負責的Framwork層。
*2.Dart語法執(zhí)行器。
*3.Skia圖像處理引擎。05年就被研發(fā)成功了(谷歌的全家桶都是由谷歌的Skia圖像處理引擎繪制的,iOS目前的圖像處理引擎是JPEG,其中Skia是對JPEG的二次封裝。)
*1.2005年Skia圖像處理引擎成立,用來展示Chrome,火狐和其他谷歌自己的產品使用。
*2.2007年第一個安卓系統(tǒng)問世,于是谷歌開發(fā)者將Skia移植到安卓平臺。
*3.Skia作為一個2D的圖像系統(tǒng),包含繪制,渲染,顯示圖片都是Skia完成。安卓中的3D部分是由OpenGLES來實現(xiàn)的,其中OpenGL ES是OpenGL的嵌入式版本。