與iOS的ViewController、Android的Activity一樣,F(xiàn)lutter中的Widget也存在生命周期,并且通過State來提現(xiàn)。而App則是一個特殊的Widget,除了需要處理視圖顯示的各個階段,還需要應(yīng)對應(yīng)用從啟動到退出所經(jīng)歷的各個狀態(tài)。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供岳池企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站設(shè)計、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為岳池眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
State的生命周期,指的是在用戶參與的情況查下,其關(guān)聯(lián)的Widget所經(jīng)歷的從創(chuàng)建到顯示再到更新最后到停止,直至銷毀的各個過程階段。
這些不同的階段涉及到的特定的任務(wù)處理,正確理解State的生命周期至關(guān)重要,State的生命周期流程圖圖,如下所示:
從圖中可以看到,State的生命周期可以分為3個階段:創(chuàng)建、更新、銷毀。下面將介紹每一個階段的具體流程
State初始化時會依次執(zhí)行:構(gòu)造方法 - initState - didChangeDependencies - build,隨后完成頁面渲染
Widget的狀態(tài)更新,主要由3個方法觸發(fā):setState、didChangeDependencies與didUpdateWidget。
一旦這三個方法被調(diào)用,F(xiàn)lutter就回銷毀舊的Widget,并調(diào)用build方法重建Widget
組件銷毀相對比較簡單,組件被移除,或者頁面銷毀的時候,系統(tǒng)會調(diào)用deactivate和dispose這兩個方法來移除或銷毀組件
下面這張表格也可以幫助我們理解記憶這些調(diào)用實際
視圖的生命周期,定義了視圖的加載到構(gòu)建的全過程,其回調(diào)機制能夠確保我們可以更具視圖的狀態(tài)選擇合適的時間做恰當(dāng)?shù)氖虑?,而App的生命周期,則定義了App從啟動到退出的全過程
在原生Android、iOS開發(fā)中,有時我們需要再對應(yīng)的App生命周期事件中做相應(yīng)的處理,比如App從后臺進入前臺,從前臺退出后臺,或者在UI繪制完成后做一些處理。
這樣的需求,在原生開發(fā)中,可以通過重寫Activity、ViewController生命周期回調(diào)方法,或者是注冊應(yīng)用程序的相關(guān)通知來兼容App的生命周期并做相應(yīng)的處理。而在Flutter中,我們可以利用WidgetsBindingObserver類,來實現(xiàn)同樣的需求。
下面我們看看WidgetsBindingObserver中具體有哪些回調(diào)函數(shù):
didChangeAppLifecycleState回調(diào)函數(shù)中,有一個參數(shù)類型為AppLifecycleState的枚舉類型,這個枚舉類型是Flutter對App生命周期狀態(tài)的封裝,它的常用狀態(tài)包括:
可以將App切前后臺,控制臺輸出的App狀態(tài),可以發(fā)現(xiàn):
我們可以通過下面的這張圖直觀的了解狀態(tài)切換過程
除了需要監(jiān)聽App的生命周期回調(diào)做相應(yīng)處理外,根據(jù)不同的需求,我們需要再組件宣講之后做一些與顯示安全相關(guān)的操作,在iOS中,可以通過GCD的方法,讓操作在下一個RunLoop執(zhí)行,在Android中,可以通過View.post()插入消息隊列,來保證在組件渲染后進行相關(guān)操作。在Flutter中實現(xiàn)同樣的需求會更簡單:使用WidgetsBinding來實現(xiàn)即可
WidgetsBinding提供了單詞Frame繪制回調(diào)和實時Frame繪制回調(diào)兩種機制來滿足不同的需求場景:
對于滾動的視圖,我們經(jīng)常需要監(jiān)聽它的一些滾動事件,在監(jiān)聽到的時候去做對應(yīng)的一些事情。
比如視圖滾動到底部時,我們可能希望做上拉加載更多;
比如滾動到一定位置時顯示一個回到頂部的按鈕,點擊回到頂部的按鈕,回到頂部;
比如監(jiān)聽滾動什么時候開始,什么時候結(jié)束;
在Flutter中監(jiān)聽滾動相關(guān)的內(nèi)容由兩部分組成:ScrollController和ScrollNotification。
ScrollController
在Flutter中,Widget并不是最終渲染到屏幕上的元素(真正渲染的是RenderObject),因此通常這種監(jiān)聽事件以及相關(guān)的信息并不能直接從Widget中獲取,而是必須通過對應(yīng)的Widget的Controller來實現(xiàn)。
ListView、GridView的組件控制器是ScrollController,我們可以通過它來獲取視圖的滾動信息,并且可以調(diào)用里面的方法來更新視圖的滾動位置。
另外,通常情況下,我們會根據(jù)滾動的位置來改變一些Widget的狀態(tài)信息,所以ScrollController通常會和StatefulWidget一起來使用,并且會在其中控制它的初始化、監(jiān)聽、銷毀等事件。
我們來做一個案例,當(dāng)滾動到1000位置的時候,顯示一個回到頂部的按鈕:
jumpTo(double offset)、animateTo(double offset,...):這兩個方法用于跳轉(zhuǎn)到指定的位置,它們不同之處在于,后者在跳轉(zhuǎn)時會執(zhí)行一個動畫,而前者不會。
ScrollController間接繼承自Listenable,我們可以根據(jù)ScrollController來監(jiān)聽滾動事件。
描述了屏幕上指針(觸摸、鼠標(biāo)、觸控筆)的位置和移動。
Flutter中可以使用Listener(功能性組件)來監(jiān)聽原始觸摸事件
例1
例2
例3
忽略PointerEvent
手勢: 描述由一個或多個指針移動組成的語義動作,如拖動、縮放、雙擊等。
Material大多數(shù)widget已經(jīng)對tap或手勢做出了響應(yīng)。 例如 IconButton和 FlatButton 響應(yīng)單擊,ListView響應(yīng)滑動事件觸發(fā)滾動。
用于手勢識別的功能性組件,通過它可以來識別各種手勢。
例(單擊)
例(添加Material觸摸水波效果 InkWell組件)
例(滑動關(guān)閉 Dismissable組件)
例(單擊、雙擊、長按)
例(滑動)
例(掃動---單一方向)
例(縮放)
GestureRecognizer是一個抽象類。
一種手勢的識別器對應(yīng)一個GestureRecognizer的子類。
例
由于手勢競爭最終只有一個勝出者,所以,當(dāng)有多個手勢識別器時,可能會產(chǎn)生沖突。
例
例
在APP中經(jīng)常會需要一個廣播機制,用以跨頁面通知。比如一個需要登錄的APP中,頁面會關(guān)注用戶登錄或注銷事件,來進行一些狀態(tài)更新。
這時候,一個事件總線便會非常有用,事件總線通常實現(xiàn)了訂閱者模式,訂閱者模式包含發(fā)布者和訂閱者兩種角色,可以通過事件總線來觸發(fā)事件和監(jiān)聽事件。
對于一些簡單的應(yīng)用,事件總線是足以滿足業(yè)務(wù)需求的,如果決定使用狀態(tài)管理包的話,一定要想清楚APP是否真的有必要使用它,防止“化簡為繁”、過度設(shè)計。
例
在widget樹中,每一個節(jié)點都可以分發(fā)通知,通知會沿著當(dāng)前節(jié)點向上傳遞,所有父節(jié)點都可以通過NotificationListener來監(jiān)聽通知。
Flutter中將這種由子向父的傳遞通知的機制稱為通知冒泡(Notification Bubbling)。
通知冒泡和用戶觸摸事件冒泡是相似的,但有一點不同:通知冒泡可以中止,但用戶觸摸事件不行。
通知冒泡和Web開發(fā)中瀏覽器事件冒泡原理是相似的,都是事件從出發(fā)源逐層向上傳遞,可以在上層節(jié)點任意位置來監(jiān)聽通知/事件,也可以終止冒泡過程,終止冒泡后,通知將不會再向上傳遞。
Flutter的UI框架實現(xiàn)中,除了在可滾動組件在滾動過程中會發(fā)出ScrollNotification之外,還有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,F(xiàn)lutter正是通過這種通知機制來使父元素可以在一些特定時機來做一些事情。
例
例
例
阻止冒泡
通知冒泡原理
效果比較多的是動態(tài)體驗,可以編寫后查看效果;
參考自 CSDN的Flutter入門課程
標(biāo)題名稱:flutter事件機制的簡單介紹
轉(zhuǎn)載來源:http://m.rwnh.cn/article8/dsdhhop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、虛擬主機、定制開發(fā)、用戶體驗、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)