Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計算機編程語言,語法類似C,是編譯型語言:

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設、成都做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務富縣,十多年網(wǎng)站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
hello world例子,打印字符串“Hello World!”:
1、沒有橋接層
React Native、Weex等技術都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術多了一個橋接層,所以界面渲染會慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:
Dart可以被編譯成不同平臺的本地代碼,讓Flutter不通過橋接層直接跟平臺通信,自然性能會快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。
3、Flutter Engine虛擬機
Flutter是依靠Flutter Engine虛擬機在iOS和Android上運行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內部進行交互,所以具有輸入低延遲和UI渲染高幀速率的特點。除了這特點之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構建的。 中心思想是您使用小部件構建UI。
窗口小部件根據(jù)其當前配置和狀態(tài)描述了它們的視圖。 當窗口小部件的狀態(tài)發(fā)生更改時,窗口小部件會重建其描述,框架將根據(jù)前面的描述進行區(qū)分,以確定底層呈現(xiàn)樹從一個狀態(tài)轉換到下一個狀態(tài)所需的最小更改。可以直接在OS平臺提供的畫布上進行描繪,也就是一些核心類庫直接放到虛擬機里面,調用起來更快。
從它的系統(tǒng)結構可以看出,類似安卓的ART(Android Run Time)虛擬機,同樣采用AOT(Ahead of TIme)技術,會在APP安裝時就編譯成機器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺上Flutter也會把Skia引擎打包到APP中,從而實現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會是構建谷歌Fuchsia應用的主要方式,前途不可限量,唯一的問題就是需要學習一門新的語言:Dart,而有Java或者C#語言基礎的程序員會比較容易學習。
現(xiàn)象:
flutter頁面通過present跳轉原生頁面后,原生頁面上的點擊會首先響應下面的flutter頁面中的內容(比如按鈕什么的)。
這是flutter框架一直存在的一個bug。在github上有相關的issue。
原因推測:
推測是flutter對控制器(或者view)加了分類,重寫了控制器的點擊事件,用來計算是否在對應的點擊位置有flutter響應事件。沒有的話再扔出去點擊事件。
解決方案1:
在原生控制器中,加入點擊事件的幾個方法的空實現(xiàn),用以覆蓋flutter框架中的實現(xiàn):
-(void)touchesBegan:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesMoved:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesCancelled:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
-(void)touchesEnded:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{
}
讓事件不被flutter截獲即可。
解決方案2:
直接切換window的根控制器到原生控制器即可。別忘暫時保存flutter控制器。
在返回時再切換回flutter中。
解決方案3:
在flutter跳轉到原生頁面之前,在flutter中加上一個蒙層,用來隔絕手勢往flutter下面的view傳遞。原生頁面返回flutter時再移除這個蒙層。
1、常用布局的對比
使用下來其他組件大致還算方便,但是相對布局而言使用便利程度上Android原生完勝,ConstraintLayout內部的所有子View可以設置互相之間的位置依賴關系。
而Flutter的Stack組件內部的Children只能通過外層包裹 Align后 固定位置,比如 Alignment.topLeft、Alignment.bottomRight 等。遇到復雜的堆疊布局需要通過外層包裹 Positioned 組件后設置固定的 top 和 left 距離以達到效果,內部子組件之間無法設置位置關聯(lián)關系。
2、一些常用屬性設置上的差異:
Margin外邊距
Android:直接在布局文件對View設置android:layout_marginStart、android:layout_marginTop
Flutter:需嵌套 Container 組件并在內部設置具體的 margin 值
Padding內邊距
Android:TextView、ImageView、各種Layout都可以直接在屬性上設置android:paddingStart
Flutter:需嵌套 Padding 組件并在內部設置具體的值
組件的可見性
Android:每個view都可以通過setVisibility來設置可見、隱藏或者隱藏但占位
Flutter:沒有單獨設置組件是否顯示的api,只能通過 bool 值控制是否添加該組件
事件監(jiān)聽
Android:常規(guī)的setOnClickListener和setOnLongClickListener設置單擊和長按事件
Flutter:在需要添加事件監(jiān)聽的組件外層嵌套 InkWell 或 GestureDetector 并設置 onTap 等
3、生命周期
Android:
Activity和Fragment各自有完整的生命周期鏈路onCreate、onStart、onResume、onPause、onDestroy等
Flutter:
萬物皆組件,組件繼承 WidgetsBindingObserver 并重寫 didChangeAppLifecycleState 函數(shù)進行監(jiān)聽
退回桌面依次執(zhí)行inactive 》= paused,此時界面不可見用戶不可操作,從桌面重新進入app執(zhí)行resumed,狀態(tài)較少如需在某些條件下觸發(fā)特定操作可能要找別的方案,比如發(fā)通知之類的
新聞名稱:flutter原生,flutter原生webview交互
分享鏈接:http://chinadenli.net/article33/dsgejss.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、域名注冊、手機網(wǎng)站建設、網(wǎng)站排名、網(wǎng)頁設計公司、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)