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

Flutter繪制地球,flutter黑屏不繪制

Flutter 之 裝飾容器DecoratedBox (四十四)

DecoratedBox可以在其子組件繪制前(或后)繪制一些裝飾(Decoration),如背景、邊框、漸變等。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站制作、隴西網(wǎng)絡(luò)推廣、微信小程序、隴西網(wǎng)絡(luò)營銷、隴西企業(yè)策劃、隴西品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供隴西建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:chinadenli.net

DecoratedBox定義如下:

我們通常會直接使用BoxDecoration類,它是一個Decoration的子類,實現(xiàn)了常用的裝飾元素的繪制。

圓形頭像

圓角頭像

flutter webwiew銷毀時間

在Widget銷毀之前將WebView的監(jiān)聽和view銷毀掉。

flutter生命周期大體上可以分為三個階段:初始化、狀態(tài)變化、銷毀。

1、初始化階段

對應(yīng)執(zhí)行構(gòu)造方法和initState時候2、狀態(tài)變化階段

開新的widget或者調(diào)用setState方法的時候

3、銷毀階段

deactivate和dispose

二、生命周期階段執(zhí)行的函數(shù)

1、initState調(diào)用次數(shù):1次

插入渲染樹時調(diào)用,只調(diào)用一次,widget創(chuàng)建執(zhí)行的第一個方法,這里可以做一些初始化工作,比如初始化State的變量。2、didChangeDependencies調(diào)用次數(shù):多次

初始化時,在initState()之后立刻調(diào)用

當(dāng)依賴的InheritedWidgetrebuild,會觸發(fā)此接口被調(diào)用。實測在組件可見狀態(tài)變化的時候會調(diào)用

3、build調(diào)用次數(shù):多次初始化之后開始繪制界面。setState觸發(fā)的時候會

4、didUpdateWidget調(diào)用次數(shù):多次組件狀態(tài)改變時候調(diào)用。

5、deactivate當(dāng)State對象從樹中被移除時,會調(diào)用此回調(diào),會在dispose之前調(diào)用。頁面銷毀的時候會依次執(zhí)行:deactivatedispose

6、dispose調(diào)用次數(shù):1次當(dāng)State對象從樹中被永久移除時調(diào)用;通常在此回調(diào)中釋放資源。

7、reassemble在熱重載(hotreload)時會被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用。

Flutter的setState(狀態(tài)刷新)

Flutter有兩個常用的狀態(tài)類:

標(biāo)記為dirty,執(zhí)行的markNeedsBuild,定義在Element類中:

當(dāng)前Element節(jié)點(diǎn)被標(biāo)記為dirty,同時調(diào)用owner的scheduleBuildFor方法:

將element元素添加到全局的“臟”鏈表里。

BuildOwner用來管理哪些需要更新的Widget。這個owner最開始被初始化的地方在WidgetsBinding的initInstances方法中,隨后初始化了onBuildScheduled方法,對應(yīng)執(zhí)行的是_handleBuildScheduled,定義在WidgetsBinding類中:

ensureVisualUpdate 方法定義在SchedulerBinding類中:

在提交下一幀繪制的時候會調(diào)用到scheduleFrame方法,提交給引擎繪制,看看scheduleFrame方法,也定義在SchedulerBinding類中:

提交給引擎繪制之后,會收到onDrawFrame的回調(diào),最終執(zhí)行到_handleDrawFrame方法中,對應(yīng)的是handleDrawFrame方法,定義在SchedulerBinding類中:

在RendererBinding的initInstances方法中添加了一個回調(diào)到這個List中,對應(yīng)的是RenderBinding的drawFrame方法,對應(yīng)的節(jié)點(diǎn)進(jìn)行繪制渲染操作。

WidgetsBinding中的drawFrame方法:

看看這里的buildScope方法,定義在BuildOwner方法中。在上面 scheduleBuildFor 方法介紹中有提到:"scheduleBuildFor 是把一個 element 添加到 _dirtyElements 鏈表,以便當(dāng)[WidgetsBinding.drawFrame]中調(diào)用 buildScope 的時候能夠重構(gòu) element。onBuildScheduled()是一個 BuildOwner 的回調(diào)"。在 drawFrame 中調(diào)用 buildOwner.buildScope(renderViewElement)更新 elements。

_dirtyElements列表在遍歷的過程中執(zhí)行rebuild方法,此時將所有標(biāo)記為dirty的Element節(jié)點(diǎn)依次執(zhí)行rebuild,preformRebuild,build,updateChild,update方法,執(zhí)行界面更新。完成build,update操作完成之后,后續(xù)會將需要繪制的RenderObject添加到需要layout的列表中,等待繪制渲染。所有繪制完成之后將_dirtyElments列表清空,_inDirtyList標(biāo)記位置為false。

提交給引擎繪制渲染

看看super.drawFrame(),這里就執(zhí)行到了RendererBinding類中,定義如下:

這里就是將最終需要繪制渲染的畫面提交給引擎的地方了,繪制完成之后就在界面顯示更新后的視圖了。

flutter貝塞爾曲線

1.要繪制貝塞爾線,我們需要四個點(diǎn): 起點(diǎn) , 終點(diǎn) 和 兩個控制點(diǎn) ,如下圖所示。移動控制點(diǎn)會改變曲線的斜率。您可以在此 在線工具中 使用控制點(diǎn)。

我們可以使用類Path的cubicTo方法繪制貝塞爾曲線:

使用控制點(diǎn)(x1,y1)和(x2,y2)添加從當(dāng)前點(diǎn)到給定點(diǎn)(x3,y3)的曲線的三次貝塞爾曲線段。

如您所見,該cubicTo方法接受三個參數(shù)。其中兩個是控制點(diǎn),最后一個參數(shù)是終點(diǎn)。起點(diǎn)是您的筆已經(jīng)位于畫布上的位置。

不要忘記在畫布坐標(biāo)中,左上角是(0,0)點(diǎn),右下角是(size.width,size.height)。因此,請嘗試相應(yīng)地調(diào)整四點(diǎn):

請記住,paint對象就像我們的筆,我們將其顏色設(shè)置為藍(lán)色,寬度設(shè)置為3。

我們用path對象描述了bezier路徑。該moveTo方法已用于將筆移動到路徑的起點(diǎn)。然后我們調(diào)用cubicTo方法來定義控制點(diǎn)和終點(diǎn)。之后,我們使用該drawPath方法繪制了路徑。

貝塞爾曲線參考:

///推薦一些曲線圖/折線圖/柱狀圖參考:

all first_rank_v2~rank_v25-2-95632571.nonecaseutm_term=flutter%20%E5%8A%A8%E6%80%81%E7%BB%98%E5%88%B6%E6%9B%B2%E7%BA%BF

Flutter組件(Widget)的局部刷新方式

Flutter中有兩個常用的狀態(tài)Widget分為StatefulWidget和StatelessWidget,分別為動態(tài)視圖和靜態(tài)視圖,視圖的更新需要調(diào)用StatefulWidget的setState方法,這會遍歷調(diào)用子Widget的build方法。如果一個頁面內(nèi)容比較復(fù)雜時,會包含多個widget,如果直接調(diào)用setState,會遍歷所有子Widget的build,這樣會造成很多不必要的開銷,所以非常有必要了解Flutter中局部刷新的方式:

globalkey唯一定義了某個element,它使你能夠訪問與element相關(guān)聯(lián)的其他對象,例如buildContext、state等。應(yīng)用場景:跨widget訪問狀態(tài)。

例如:可以通過key.currentState拿到它的狀態(tài)對象,然后就可以調(diào)用其中的onPressed方法。

Flutter框架內(nèi)部提供了一個非常小巧精致的組件,專門用于局部組件的刷新。適用于值改動的刷新。

實現(xiàn)原理:在 initState 中對傳入的可監(jiān)聽對象進(jìn)行監(jiān)聽,執(zhí)行 _valueChanged 方法,_valueChanged 中進(jìn)行了 setState 來觸發(fā)當(dāng)前狀態(tài)的刷新。觸發(fā) build 方法,從而觸發(fā) widget.builder 回調(diào),這樣就實現(xiàn)了局部刷新。可以看到這里回調(diào)的 child 是組件傳入的 child,所以直接使用,這就是對 child 的優(yōu)化的根源。

可以看到 ValueListenableBuilder 實現(xiàn)局部刷新的本質(zhì),也是進(jìn)行組件的抽離,讓組件狀態(tài)的改變框定在狀態(tài)內(nèi)部,并通過 builder 回調(diào)控制局部刷新,暴露給用戶使用。

通過這個可以創(chuàng)建一個支持局部刷新的widget樹,比如你可以在StatelessWidget里面刷新某個布局,但是不需要改變成StatefulWidget;也可以在StatefulWidget中使用做部分刷新而不需要刷新整個頁面,這個刷新是不會調(diào)用Widget build(BuildContext context)刷新整個布局樹的。

異步UI更新:

很多時候我們會依賴一些異步數(shù)據(jù)來動態(tài)更新UI,比如在打開一個頁面時我們需要先從互聯(lián)網(wǎng)上獲取數(shù)據(jù),在獲取數(shù)據(jù)的過程中顯示一個加載框,等獲取到數(shù)據(jù)時我們再渲染頁面;又比如我們想展示Stream(比如文件流、互聯(lián)網(wǎng)數(shù)據(jù)接收流)的進(jìn)度。當(dāng)然StatefulWidget我們完全可以實現(xiàn)以上功能。但由于在實際開發(fā)中依賴異步數(shù)據(jù)更新UI的這種場景非常常見,并且當(dāng)StatefulWidget中控件樹較大時,更新一個屬性導(dǎo)致整個樹重建,消耗性能,因此Flutter專門提供了FutureBuilder和SteamBuilder兩個組件來快速實現(xiàn)這種功能。

通常情況下,子Widget無法單獨(dú)感知父Widget的變化,當(dāng)父state變化時,通過其build重建所有子widget;

InheriteddWidget可以避免這種全局創(chuàng)建,實現(xiàn)局部子Widget更新。InheritedWidget提供了一種在Widget樹中從上到下傳遞、共享數(shù)據(jù)的方式。Flutter SDK正是通過InheritedWidget來共享應(yīng)用主題和Locale等信息。

InheritedWidgetData

TestData

InheritedTest1Page

provider是Google I/O 2019大會上宣布的現(xiàn)在官方推薦的管理方式,而ChangeNotifierProvider可以說是Provider的一種:

yaml文件需要引入provider: ^3.1.0

頂層嵌套ChangeNotifierProvider

創(chuàng)建共享數(shù)據(jù)類DataInfo:

數(shù)據(jù)類需要with ChangeNotifier 以使用 notifyListeners()函數(shù)通知監(jiān)聽者更新界面。

使用Provider.of(context)獲取DataInfo

nextPage:

使用Consumer包住需要使用共享數(shù)據(jù)的Widget

RepaintBoundary就是重繪邊界,用于重繪時獨(dú)立于父視圖。頁面需要更新的頁面結(jié)構(gòu)可以用 RepaintBoundary組件嵌套,flutter 會將包含的組件獨(dú)立出一層"畫布",去繪制。官方很多組件 外層也包了層 RepaintBoundary 標(biāo)簽。如果你的自定義view比較復(fù)雜,應(yīng)該盡可能的避免重繪。

以上總結(jié)了幾種Flutter的局部刷新的方式,可根據(jù)實際需要使用不同的方式,最適合的才是最好的。

Flutter - 單次Frame繪制回調(diào)(addPostFrameCallback)

通過addPostFrameCallback可以做一些安全的操作,在有些時候是很有用的,它會在當(dāng)前Frame繪制完后進(jìn)行回調(diào),并只會回調(diào)一次,如果要再次監(jiān)聽需要再設(shè)置。

本文標(biāo)題:Flutter繪制地球,flutter黑屏不繪制
網(wǎng)站網(wǎng)址:http://chinadenli.net/article41/dsgihed.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄做網(wǎng)站微信小程序定制網(wǎng)站靜態(tài)網(wǎng)站App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計