1、繼承SingleChildStatelessWidget,就是一個(gè)widget,通過(guò)create 傳入一個(gè)Bloc對(duì)象
創(chuàng)新互聯(lián)專注于橋東網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供橋東營(yíng)銷型網(wǎng)站建設(shè),橋東網(wǎng)站制作、橋東網(wǎng)頁(yè)設(shè)計(jì)、橋東網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造橋東網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供橋東網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
1、Bloc繼承自BlocBase,BlocBase中創(chuàng)建了StreamController對(duì)象,為多訂閱對(duì)象
其中onCounterEvent((event, emit)為初始化創(chuàng)建_eventController監(jiān)聽(tīng)
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)聽(tīng)stateController廣播通知
a、Flutter中繼承是單繼承
b、構(gòu)造函數(shù)或者析構(gòu)函數(shù)不能繼承
c、子類重寫父類方法要在方法前加@override
d、子類調(diào)用父類的方法用super
Flutter 中子類可以訪問(wèn)父類的所有變量和方法,因?yàn)镕lutter沒(méi)有public 和 private 之分
a、混合對(duì)象是一個(gè)類
b、一個(gè)類可以混合多個(gè)類
a、class 就是一個(gè)接口
b、class 被當(dāng)做接口使用時(shí),class的方法就是接口方法。需要重新實(shí)現(xiàn)接口方法,方法前使用@override關(guān)鍵字
c、class 被當(dāng)做接口使用時(shí),class的成員變量也需要在子類重新實(shí)現(xiàn),使用@override關(guān)鍵字.
d、被實(shí)現(xiàn)的接口可以有多個(gè)
Dart中的繼承:
1.子類使用extends關(guān)鍵詞來(lái)繼承父類
2.子類會(huì)繼承父類里面可見(jiàn)的屬性和方法,但是不會(huì)繼承構(gòu)造函數(shù)
3.子類能復(fù)寫父類的方法 getter和setter
子類使用extends關(guān)鍵詞來(lái)繼承父類
子類里面可以擴(kuò)展自己屬性和方法
Flutter中Widget,State和BuildContext的概念是每個(gè)Flutter開(kāi)發(fā)人員需要完全理解的最重要概念之一。這里先講解一下Widget以及Widget。三者之間的關(guān)系會(huì)在最后一篇總結(jié)一下。
Widget類在Flutter中是非常重要的,繼承自Widget類的有PreferredSizeWidget、ProxyWidget、RenderObjectWidget、StatefulWidget、StatelessWidget。我們?nèi)粘J褂玫慕^大部分widget都是繼承自Widget類,查看Widget類源碼,內(nèi)部實(shí)現(xiàn)非常簡(jiǎn)單,構(gòu)造函數(shù)如下:
在flutter中構(gòu)建APP是由widget樹(shù)構(gòu)建起來(lái)的,所以這個(gè)key的作用是用來(lái)控制在widget樹(shù)中替換widget的時(shí)候使用的。其中Key類是Widget、Element以及SemanticsNode的唯一標(biāo)識(shí)符,繼承自Key的還有LocalKey以及GlobalKey。詳細(xì)可以去framework.dart文件查看相關(guān)源碼及說(shuō)明。
在Flutter中,我們平時(shí)自定義的widget,一般都是繼承自StatefulWidget或StatelessWidget(并不是只有這兩種),這兩種widget也是目前最常用的兩種。如果一個(gè)控件自身狀態(tài)不會(huì)去改變,創(chuàng)建了就直接顯示,不會(huì)有色值、大小或者其他屬性的變化,這種widget一般都是繼承自StatelessWidget,常見(jiàn)的有Container、ScrollView等。如果一個(gè)控件需要?jiǎng)討B(tài)的去改變或者相應(yīng)一些狀態(tài),例如點(diǎn)擊態(tài)、色值、內(nèi)容區(qū)域等,那么一般都是繼承自StatefulWidget,常見(jiàn)的有CheckBox、AppBar、TabBar等。兩者的差別在于是否有狀態(tài)。
對(duì)于StatelessWidget,build方法會(huì)在如下三種情況下調(diào)用:
我們?cè)趧?chuàng)建State的時(shí)候可以看到和StatefulWidget相似的build方法,也就是說(shuō)我們也可以獲得一個(gè)BuildContext,在使用StatefulWidget.createState創(chuàng)建它們之前以及在調(diào)用initState之前,框架將State對(duì)象與BuildContext關(guān)聯(lián)起來(lái),該關(guān)聯(lián)是永久的:State對(duì)象永遠(yuǎn)不會(huì)改變它的BuildContext(但是BuildContext本身可以在控件樹(shù)中移動(dòng))。后面講解一下這個(gè)BuildContext對(duì)象在整個(gè)程序中什么角色
State的作用有兩點(diǎn):
State的生命周期有四種狀態(tài):
完整生命周期如下:
當(dāng)控件的配置被更改時(shí)會(huì)調(diào)用State.didUpdateWidget方法,此時(shí)框架會(huì)重新繪制控件。你也可以使用State.setState方法在狀態(tài)發(fā)生變化時(shí)通知框架,告訴框架該對(duì)象的內(nèi)部狀態(tài)已經(jīng)改變,框架接到通知后也會(huì)重新繪制控件。
State中比較重要的一個(gè)方法是setState,當(dāng)修改狀態(tài)時(shí),widget會(huì)被更新。比方說(shuō)點(diǎn)擊CheckBox,會(huì)出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過(guò)修改狀態(tài)來(lái)達(dá)到的。查看setState源碼,在一些異常的情況下將會(huì)拋出異常:
markNeedsBuild內(nèi)部,則是通過(guò)標(biāo)記element為diry,在下一幀的時(shí)候重建(rebuild)??梢钥闯鰏etState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時(shí)候才會(huì)去進(jìn)行。
StatefulWidget的兩個(gè)主要類別:
在我的小部件的生命周期中,我是否需要考慮一個(gè)將要更改的變量,何時(shí)更改,將強(qiáng)制重建小部件?
如果問(wèn)題的答案是肯定的,那么您需要一個(gè)有狀態(tài)的小部件,否則,您需要一個(gè)無(wú)狀態(tài)小部件。
比如:
provider 是flutter 中的狀態(tài)管理 開(kāi)源庫(kù);
存儲(chǔ)的數(shù)據(jù)對(duì)象 必須extends ChangeNotifier;下層widget 通過(guò) Provider.of(context) 函數(shù) 獲取model對(duì)象 ,并且可以建立依賴關(guān)系;當(dāng)數(shù)據(jù)對(duì)象發(fā)生變化時(shí),依賴的widget 會(huì)重新build,像不像InheritedWidget Provider 沒(méi)錯(cuò) 下層widget就是 封裝了InheritedWidget
主要 通過(guò) Provider.ofT(context) 函數(shù),來(lái)獲?。?/p>
推薦使用 Provider.of而不是 Consumer,因?yàn)?listen默認(rèn)為true,也就是說(shuō) 默認(rèn) 依賴于 持有數(shù)據(jù)model的widget 對(duì)應(yīng)的element;
數(shù)據(jù)類 可繼承的 ChangeNotifier,本身和privider框架 沒(méi)有關(guān)系;
ChangeNotifier 是 flutter框架 提供的工具類, 用來(lái)實(shí)現(xiàn)一對(duì)多的訂閱通知功能。
在Tree中從上往下高效傳遞數(shù)據(jù)的基類widget , 定義為:abstract class InheritedWidget extends ProxyWidget
Flutter的響應(yīng)式開(kāi)發(fā)與React類似,數(shù)據(jù)都是自頂向下的。
假設(shè)有祖先組點(diǎn)A,中間經(jīng)過(guò)結(jié)點(diǎn)B, C,然后到結(jié)點(diǎn)D,D需要從A中獲取數(shù)據(jù)f,那按照自頂向下數(shù)據(jù)流轉(zhuǎn),f需要依次傳遞給B及C,最后才到C。這樣開(kāi)發(fā)極為不靈活,成本也比較高。所有Flutter需要有跨結(jié)點(diǎn)(只能是祖先后代節(jié)點(diǎn),不能跨兄弟節(jié)點(diǎn))高效傳遞數(shù)據(jù)的方案。
大體意思如下:
InheritedWidget 是在樹(shù)中高效向下傳遞信息的基類部件;
調(diào)用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實(shí)例;
在 InheritedWidget 類型的控件被引用,也就是調(diào)用過(guò) inheritFromWidgetOfExactType 方法后,當(dāng) InheritedWidget 自身狀態(tài)改變時(shí),會(huì)導(dǎo)致引用了 InheritedWidget 類型的子控件重構(gòu)(rebuild)。
這里隨便定義一個(gè)人 Person 類。
創(chuàng)建一個(gè)類繼承 InheritedWidget,并實(shí)現(xiàn) updateShouldNotify 方法。
之前說(shuō)到調(diào)用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實(shí)例,所以此處定義一個(gè)靜態(tài)的 of 方法,通過(guò)傳入的 context 獲取到最近的 InheriedDataWidget 實(shí)例。
1.定義數(shù)據(jù)模型
這里隨便定義一個(gè) Person 類。
2.自定義 InheritedWidget 控件類
創(chuàng)建一個(gè)類繼承 InheritedWidget,并實(shí)現(xiàn) updateShouldNotify 方法。
之前說(shuō)到調(diào)用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實(shí)例,所以此處定義一個(gè)靜態(tài)的 of 方法,通過(guò)傳入的 context 獲取到最近的 InheriedDataWidget 實(shí)例。
3.InheriedDataWidget 的使用
InheriedDataWidget 使用起來(lái)也很簡(jiǎn)單,它本身也是一個(gè)控件,只要在任意一個(gè)頁(yè)面的子控件調(diào)用其構(gòu)造方法就行,這里我們定義一個(gè)形如的 Widget 樹(shù)。
WidgetA 是一個(gè) StatefulWidget 類型的控件,可以調(diào)用 setState 刷新,如果是繼承人 Stateless 類型的控件,那我們也可以通過(guò) Stream 或者其他方式刷新數(shù)據(jù),感興趣的請(qǐng)看[什么是 Stream? Dart
WidgetA1_1 類
WidgetA1_2 類
WidgetA1_3 類
當(dāng)我們點(diǎn)擊 floatingActionButton 的時(shí)候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都會(huì)更新 Person 的信息,而且每點(diǎn) floatingActionButton 一次, 當(dāng)我們點(diǎn)擊 floatingActionButton 的時(shí)候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都會(huì)更新 Person 的信息,而且每點(diǎn) floatingActionButton 一次,都會(huì)輸出:
如果我們?cè)噲D在和 WidgetA 的同一層級(jí)的兄弟節(jié)點(diǎn)去訪問(wèn) InheriedDataWidget 的 Person 數(shù)據(jù),是不行的,因?yàn)楦腹?jié)點(diǎn)中并沒(méi)有插入 InheriedDataWidget。
把 WidgetB 和 WidgetA 保持同一節(jié)點(diǎn)
這也體現(xiàn)了 Inheried(遺傳) 這一單詞的特性,遺傳只存在于父子。兄弟不存在遺傳的關(guān)系。
這種數(shù)據(jù)共享的方式在某些場(chǎng)景還是很有用的,就比如說(shuō)全局主題,字體大小,字體顏色的變更,只要在 App 根層級(jí)共享出這些配置數(shù)據(jù),然后在觸發(fā)數(shù)據(jù)改變之后,所有引用到這些共享數(shù)據(jù)的地方都會(huì)刷新,這換主題,字體是不是就很輕松,事實(shí)上 Theme.of(context).primaryColor 之流就是這么干的。
以上就是有關(guān)InheritedWidget的使用。
自己也是從事Android開(kāi)發(fā)5年有余了;整理了一些Android開(kāi)發(fā)技術(shù)核心筆記和面經(jīng)題綱,有關(guān)更多Android開(kāi)發(fā)進(jìn)階技術(shù)資料、面經(jīng)題綱、核心技術(shù)筆記; 想要進(jìn)階自己、拿高薪的同學(xué)請(qǐng)私信我回復(fù)“核心筆記”或“面試”領(lǐng)??!
本文名稱:flutter繼承關(guān)系,float可以繼承嗎
網(wǎng)站URL:http://jinyejixie.com/article20/dsedjjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、標(biāo)簽優(yōu)化、Google、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、軟件開(kāi)發(fā)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)