欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

flutter原理,flutter編譯原理

Flutter面試:渲染原理

頁面中的各界面元素(Widget)以樹的形式組織,即控件樹。Flutter通過控件樹中的每個(gè)控件創(chuàng)建不同類型的渲染對(duì)象,組成渲染對(duì)象樹。而渲染對(duì)象樹在Flutter的展示過程分為三個(gè)階段:布局、繪制、合成和渲染。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括化德網(wǎng)站建設(shè)、化德網(wǎng)站制作、化德網(wǎng)頁制作以及化德網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,化德網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到化德省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

(一)布局

Flutter采用深度優(yōu)先機(jī)制遍歷渲染對(duì)象樹,決定渲染對(duì)象樹中各渲染對(duì)象在屏幕上的位置和尺寸。在布局過程中,渲染對(duì)象樹中的每個(gè)渲染對(duì)象都會(huì)接收父對(duì)象的布局約束參數(shù),決定自己的大小,然后父對(duì)象按照控件邏輯決定各個(gè)子對(duì)象的位置,完成布局過程。

為了防止因子節(jié)點(diǎn)發(fā)生變化而導(dǎo)致整個(gè)控件樹重新布局,F(xiàn)lutter加入了一個(gè)機(jī)制——布局邊界(Relayout Boundary),可以在某些節(jié)點(diǎn)自動(dòng)或手動(dòng)地設(shè)置布局邊界,當(dāng)邊界內(nèi)的任何對(duì)象發(fā)生重新布局時(shí),不會(huì)影響邊界外的對(duì)象,反之亦然。

二)繪制

布局完成后,渲染對(duì)象樹中的每個(gè)節(jié)點(diǎn)都有了明確的尺寸和位置。Flutter會(huì)把所有的渲染對(duì)象繪制到不同的圖層上。與布局過程一樣,繪制過程也是深度優(yōu)先遍歷,而且總是先繪制自身,再繪制子節(jié)點(diǎn)。

以下圖為例:節(jié)點(diǎn)1在繪制完自身后,會(huì)再繪制節(jié)點(diǎn)2,然后繪制它的子節(jié)點(diǎn)3、4和5,最后繪制節(jié)點(diǎn)6。

可以看到,由于一些其他原因(比如,視圖手動(dòng)合并)導(dǎo)致2的子節(jié)點(diǎn)5與它的兄弟節(jié)點(diǎn)6處于了同一層,這樣會(huì)導(dǎo)致當(dāng)節(jié)點(diǎn)2需要重繪的時(shí)候,與其無關(guān)的節(jié)點(diǎn)6也會(huì)被重繪,帶來性能損耗。

為了解決這一問題,F(xiàn)lutter提出了與布局邊界對(duì)應(yīng)的機(jī)制——重繪邊界(Repaint Boundary)。在重繪邊界內(nèi),F(xiàn)lutter會(huì)強(qiáng)制切換新的圖層,這樣就可以避免邊界內(nèi)外的互相影響,避免無關(guān)內(nèi)容置于同一圖層引起不必要的重繪。

重繪邊界的一個(gè)典型場(chǎng)景是Scrollview。ScrollView滾動(dòng)的時(shí)候需要刷新視圖內(nèi)容,從而觸發(fā)內(nèi)容重繪。而當(dāng)滾動(dòng)內(nèi)容重繪時(shí),一般情況下其他內(nèi)容是不需要重繪的,這時(shí)候重繪邊界就派上用場(chǎng)了。

(三)合成和渲染

終端設(shè)備的頁面越來越復(fù)雜,因此Flutter的渲染樹層級(jí)通常很多,直接交付給渲染引擎進(jìn)行多圖層渲染,可能會(huì)出現(xiàn)大量渲染內(nèi)容的重復(fù)繪制,所以還需要先進(jìn)行一次圖層合成,即將所有的圖層根據(jù)大小、層級(jí)、透明度等規(guī)則計(jì)算出最終的顯示效果,將相同的圖層歸類合并,簡化渲染樹,提高渲染效率。

合并完成后,F(xiàn)lutter會(huì)將幾何圖層數(shù)據(jù)交由Skia引擎加工成二維圖像數(shù)據(jù),最終交由GPU進(jìn)行渲染,完成界面的展示。

四、總結(jié)

咱們從各種業(yè)界主流跨端方案與Flutter的對(duì)比開始,到Flutter的簡要介紹以及Flutter的運(yùn)行機(jī)制,并以界面渲染過程為例,從布局、繪制、合成和渲染三個(gè)階段講述了Flutter的實(shí)現(xiàn)原理。相信大家對(duì)Flutter已經(jīng)有一個(gè)整體認(rèn)知,趕快一起上手操作起來吧!

Flutter Widget的渲染原理

抽象類Element 有mount方法

抽象類Widget 有createElement方法

RenderObjectWidget有createElement方法 和??createRenderObject方法

每一個(gè)Widget, 都有createElement方法,通過createElement方法 創(chuàng)建一個(gè)Element對(duì)象,

Element加入Element樹中,它會(huì)創(chuàng)建三種Element ,每個(gè)Element 有個(gè)mount方法

第一種:RenderObjectElement(RenderObjectWidget的createElement方法)

mount方法中 調(diào)用

widget.createRenderObject(this) ,創(chuàng)建RenderObject對(duì)象,RenderObject對(duì)象加入Render樹中

第二種:StatefulElement繼承ComponentElement?

第三種:StatelessElement繼承ComponentElement?

并不是所有的Widget都會(huì)被獨(dú)立渲染!只有繼承RenderObjectWidget的才會(huì)創(chuàng)建RenderObject對(duì)象!?

Flutter Provider實(shí)現(xiàn)原理

ChangeNotifierProvider、ChangeNotifier、Consumer的關(guān)系

1、ChangeNotifierProvider的父類ListenableProvider,ListenableProvider中實(shí)現(xiàn)了_startListening方法,_startListening主要是將Element的刷新方法添加到ChangeNotifier中的_listeners中

2、ListenableProvider將startListening傳入其父類InheritedProvider,InheritedProvider主要是創(chuàng)建delegate = _CreateInheritedProvider。這個(gè)delegate就是_CreateInheritedProvider中delegate.startListening中的delegate

1、ChangNotifier負(fù)責(zé)更新UI

ChangeNotifier中notifyListeners,通過遍歷_listeners,實(shí)現(xiàn)強(qiáng)制刷新UI

1、Consumer:包裹待刷新UI,在buildWithChild中將Provider.ofT(context)傳入builder方法

2、解析 Provider.ofT(context)

Provider.ofT(context)是獲取ChangeNotifier對(duì)象的方法

Provider.of中通過傳入的context,獲取父視圖為inheritedElement的對(duì)象

獲取到inheritedElement,通過inheritedElement.getValue的方式獲取ChangeNotifier對(duì)象

7、繼續(xù)查看inheritedElement?.value。通過斷點(diǎn)可以進(jìn)入_CreateInheritedProvider 類中g(shù)et Value方法。調(diào)用startListening將當(dāng)前Consumer包裹的element添加到Prorivder的_listeners數(shù)組中

通過調(diào)用notifyListeners()來刷新所有Consumer完整的Provider執(zhí)行流程大概就是這樣,流程圖如下

flutter與原生交互方法和底層原理分析

1.環(huán)境準(zhǔn)備, 參考鏈接

2.添加國內(nèi)環(huán)境配置: 參考鏈接

3.新建

name: String類型,代表Channel的名字,也是其唯一標(biāo)識(shí)符。

messager:BinaryMessenger類型,代表消息信使,是消息的發(fā)送與接收的工具。

codec: MessageCodec類型或MethodCodec類型,代表消息的編解碼器。

fluuter中的MessageCodec用于二進(jìn)制格式數(shù)據(jù)與基礎(chǔ)數(shù)據(jù)之間的編解碼。BasicMessageChannel所使用的編解碼器就是MessageCodec。

iOS中,名稱為FlutterMessageCodec,是一個(gè)協(xié)議,定義了兩個(gè)方法:encode接收一個(gè)類型為id的消息,將其編碼為NSData類型,而decode接收NSData類型消息,將其解碼為id類型數(shù)據(jù)。

MessageCodec有多種不同的實(shí)現(xiàn):

與MessageCodec不同的是,MethodCodec用于MethodCall對(duì)象的編解碼,一個(gè)MethodCall對(duì)象代表一次從Flutter端發(fā)起的方法調(diào)用。MethodCall有2個(gè)成員變量:String類型的method代表需要調(diào)用的方法名稱,通用類型(Android中為Object,iOS中為id)的arguments代表需要調(diào)用的方法入?yún)?/p>

由于處理的是方法調(diào)用,故相比于MessageCodec,MethodCodec多了對(duì)調(diào)用結(jié)果的處理。當(dāng)方法調(diào)用成功時(shí),使用encodeSuccessEnvelope將result編碼為二進(jìn)制數(shù)據(jù),而當(dāng)方法調(diào)用失敗時(shí),則使用encodeErrorEnvelope將error的code、message、detail編碼為二進(jìn)制數(shù)據(jù)

MethodCodec有兩種實(shí)現(xiàn):

Flutter Bloc實(shí)現(xiàn)原理

1、繼承SingleChildStatelessWidget,就是一個(gè)widget,通過create 傳入一個(gè)Bloc對(duì)象

1、Bloc繼承自BlocBase,BlocBase中創(chuàng)建了StreamController對(duì)象,為多訂閱對(duì)象

其中onCounterEvent((event, emit)為初始化創(chuàng)建_eventController監(jiān)聽

2、Bloc中創(chuàng)建_eventController,為事件通知

3、BlocBase創(chuàng)建_stateController,為狀態(tài)刷新通知

4、add方法是執(zhí)行廣播通知

5、處理完數(shù)據(jù)之后執(zhí)行emit()方法,其中emit方法是stateController廣播

1、 BlocBuilder繼承自BlocBuilderBase,_BlocBuilderBaseState中build方法返回的是BlocListener

2、BlocListener繼承BlocListenerBase,_BlocListenerBaseState中_subscribe()添加監(jiān)聽stateController廣播通知

Flutter Channel底層原理分析

百度網(wǎng)盤flutter 見46-Flutter Channel

Flutter 提供三種Channel用作Flutter與iOS原生平臺(tái)之間的數(shù)據(jù)傳遞

1.FlutterBasicMessageChannel: 用作頻繁與原生交互

2.FlutterMethodChannel:用來調(diào)用方法,雙向通訊

3.FlutterEventChannel:數(shù)據(jù)流通訊

三種Channel,都有以下成員變量

1.name: Channel 的唯一標(biāo)識(shí)

在Flutter應(yīng)用中,通常存在多個(gè)Platform Channel,使用name區(qū)分不同的Channel

2.messenger: 消息信使(BinaryMessenger)

負(fù)責(zé)Flutter與原生之間的相互通訊

[methodChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult? _Nonnull ?result) {

}];

setMethodCallHandler方法,MethodCallHandler放在FlutterBinaryMessageHandler中

創(chuàng)建一個(gè)FlutterMethodChannel,通過 setMethodCallHandler來進(jìn)行消息處理,最終會(huì)為FlutterMethodChannel綁定一個(gè)FlutterBinaryMessageHandler,并以FlutterMethodChannel的name作為key,保存在一個(gè)Map結(jié)構(gòu)中

先創(chuàng)建 FlutterEngine-FlutterViewController-FlutterMethodChannel,

調(diào)用setMethodCallHandler方法時(shí),會(huì)進(jìn)入FlutterEngine的setMessageHandlerOnChannel:binaryMessageHandle:中,在進(jìn)入PlatformMessageRouter中進(jìn)行儲(chǔ)存

當(dāng)前標(biāo)題:flutter原理,flutter編譯原理
標(biāo)題鏈接:http://chinadenli.net/article10/dsgdgdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)App開發(fā)靜態(tài)網(wǎng)站網(wǎng)站設(shè)計(jì)網(wǎng)站排名品牌網(wǎng)站制作

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)