Dart面試總結(jié)

一、Dart當(dāng)中的【..】表示什么意思?

Dart當(dāng)中的【..】意思是 級(jí)聯(lián)操作符,為了方便配置而使用?!?.】 返回的相當(dāng)于this

二、Dart的作用域

Dart沒(méi)有public、private等關(guān)鍵字,默認(rèn)就是公開(kāi)的,私有變量使用下劃線_開(kāi)頭,但是有一個(gè)@protected注解

三、Dart是不是單線程模型?是如何運(yùn)行的?

Dart是單線程模型,運(yùn)行的流程如下圖


截屏2020-12-03 上午10.47.39.png

簡(jiǎn)單來(lái)說(shuō),Dart在單線程中是以消息循環(huán)機(jī)制來(lái)運(yùn)行的,包含兩個(gè)任務(wù)隊(duì)列,一個(gè)是‘微型任務(wù)隊(duì)列’microtask queue,另一個(gè)叫做‘事件隊(duì)列’event queue。

當(dāng)Flutter應(yīng)用啟動(dòng)后,消息循環(huán)機(jī)制便啟動(dòng)了。首先會(huì)按照先進(jìn)先出的順序逐個(gè)執(zhí)行微任務(wù)隊(duì)列中的任務(wù),當(dāng)所有微任務(wù)隊(duì)列執(zhí)行完后便開(kāi)始執(zhí)行事件隊(duì)列中的任務(wù),事件任務(wù)執(zhí)行完畢再去執(zhí)行微任務(wù),如此玄幻往復(fù),生生不息。

四、Dart是如何實(shí)現(xiàn)多任務(wù)并行的?

前面說(shuō)過(guò),Dart是單線程的,不存在多線程,那如何進(jìn)行多任務(wù)并行的呢?其實(shí)Dart的多線程和前端的多線程有很多相似之處。Flutter的多線程主要依賴Dart的并發(fā)編程、異步和事件驅(qū)動(dòng)機(jī)制。

截屏2020-12-03 上午10.55.04.png

簡(jiǎn)單的說(shuō),在Dart中,一個(gè)Isolate(被隔離的)對(duì)象其實(shí)就是一個(gè)isolate執(zhí)行環(huán)境的引用,一般來(lái)說(shuō)我們都是通過(guò)當(dāng)前的isolate去控制其他的isolate完成彼此之間的交互,而當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)新的Isolate可以使用Isolate.spawn方法獲取返回的一個(gè)新的isolate對(duì)象,兩個(gè)isolate之間使用sendPort相互發(fā)送消息,而isolate中也存在了一個(gè)與之對(duì)應(yīng)的ReceivePort接收消息來(lái)處理,但是我們需要注意的是,ReceivePort和SendPort在每個(gè)isolate都有一對(duì),只有同一個(gè)isolate中的ReceivePort才能接收到當(dāng)前類的SendPort發(fā)送的消息并且處理。

五、說(shuō)一下Dart異步編程中的Future關(guān)鍵字?

前面說(shuō)過(guò),Dart在單線程中一消息循環(huán)機(jī)制來(lái)運(yùn)行的,其中包含連個(gè)隊(duì)列,一個(gè)是‘微型任務(wù)隊(duì)列’microtask queue, 另一個(gè)叫做'事件隊(duì)列' event queue

在Dart中,執(zhí)行一個(gè)異步任務(wù)可以使用Future來(lái)處理。在Dart的每一個(gè)Isolate中,執(zhí)行的優(yōu)先級(jí)為:Main > MicroTask > EventQueue

六、說(shuō)一下Dart異步編程中的Stream數(shù)據(jù)流?

在Dart中,Stream和Future一樣,都是用來(lái)處理異步編程的工具。他們的區(qū)別在于,Stream可以接收多個(gè)異步結(jié)果,而Future只有一個(gè)。
Stream的創(chuàng)建可以使用Stream.fromFuture. 也可以使用StreamController來(lái)創(chuàng)建和控制。還有一個(gè)注意點(diǎn):普通的Stream只有一個(gè)訂閱者,如果想要有多個(gè)訂閱的話,要使用asBroadcastStream().

七、Stream有哪兩種訂閱模式?分別是怎么調(diào)用的?

Stream有兩種訂閱模式:?jiǎn)斡嗛啠╯ingle)和多訂閱(brodcast)。單訂閱就是只能有一個(gè)訂閱者,而廣播是可以有多個(gè)訂閱者。這就類似于消息服務(wù)的處理模式。單訂閱類似于點(diǎn)對(duì)點(diǎn),在訂閱者出現(xiàn)之前會(huì)持有數(shù)據(jù),在訂閱者出現(xiàn)之后才會(huì)轉(zhuǎn)交給它。而廣播類似于發(fā)布訂閱模式,可以同時(shí)有多個(gè)訂閱者,當(dāng)有數(shù)據(jù)就會(huì)傳遞給所有的訂閱者,而不管當(dāng)前是否已有訂閱者存在。

Stream默認(rèn)處于單訂閱模式,所以同一個(gè)stream上的listen和其他大多數(shù)方法只能調(diào)用一次,調(diào)用第二次就會(huì)報(bào)錯(cuò)。但Stream可以通過(guò)transform()方法(返回另一個(gè)Stream
)進(jìn)行連續(xù)調(diào)用。通過(guò)Stream.asBroadcastStream() 可以將一個(gè)單訂閱模式的Stream轉(zhuǎn)換成一個(gè)多訂閱模式的Stream,isBroadcast屬性可以判斷當(dāng)前Stream所處的模式。

八、await for 如何使用?

await for 是不斷獲取stream流中的數(shù)據(jù),然后執(zhí)行循環(huán)體中的操作。它一般用在知道stream什么時(shí)候完成,并且必須等待傳遞完成之后才能使用,不然就會(huì)一直阻塞。

sss() async {
    Stream<String> steam = new Stream<String>.fromIterable([
      '不開(kāi)心',
      '面試',
      '沒(méi)'
    ]);
    await for (String item in steam) {
      print(item);
    }
  }

九、說(shuō)一下mixin機(jī)制?

mixin是Dart2.1加入的特性,以前版本通常使用abstract class代替。簡(jiǎn)單來(lái)說(shuō),mixin是為了解決繼承方面的問(wèn)題而引入的機(jī)制,Dart為了支持多重繼承,引入了mixin關(guān)鍵字,他的最大特殊在于:mixin定義的類不能有構(gòu)造方法,這樣可以避免繼承多個(gè)類而產(chǎn)生的父類構(gòu)造器方法沖突。

mixins的對(duì)象是類,mixins絕不是繼承,也不是接口,而是一種全新的特性,可以mixins多個(gè)類,mixins的使用需要滿足一定的條件。

十、Dart中const與final的區(qū)別

  • final :表明這個(gè)變量不能再發(fā)生變化,是常量的意思,但是具體變量的值是在運(yùn)行時(shí)才能確定的。一旦初始化,則不允許再次發(fā)生更改。
  • const: const定義時(shí),需要是個(gè)明確的值,在編譯期間就確定了值。一旦初始化,也不能更改。

十一、Flutter中的key

參考:http://www.itdecent.cn/p/5d8ace3d411a

十二、mixin extends implement 之間的關(guān)系?

繼承(關(guān)鍵字extends)、混入mixins(關(guān)鍵字with)、接口實(shí)現(xiàn)(關(guān)鍵字 implements)。這三者可以同時(shí)存在,前后順序是extends -> mixins -> implements

Flutter中繼承是單繼承,子類重寫(xiě)超類的方法要用@Override,子類調(diào)用超類的方法要用super。

在Flutter中,Mixins是一種在多個(gè)類層次結(jié)構(gòu)中復(fù)用類代碼的方法。mixins的對(duì)象是類,mixins絕不是繼承,也不是接口,而是一種全新的特性,可以mixins多個(gè)類,mixins的使用需要滿足一定條件。

十三、使用mixins的條件是什么?

因?yàn)閙ixns使用的條件,隨著Dart版本一直在變,這里講Dart2.1中使用的mixins的條件:
mixins類只能繼承自object
mixins類不能有構(gòu)造函數(shù)
一個(gè)類可以mixins多個(gè)mixins類
可以mixins多個(gè)類,不破壞Flutter的單繼承

十四、mixin怎么指定異常類型?

on關(guān)鍵字可用于指定異常類型。on只能用于被mixins標(biāo)記的類,例如mixins X on A,意思是mixins X的話,得先接口實(shí)現(xiàn)或繼承A。這里A可以是類,也可以是接口,但是在mixins的時(shí)候用法有區(qū)別。
on一個(gè)類:

class A {
  void a(){
    print("a");
  }
}


mixin X on A{
  void x(){
    print("x");
  }
}


class mixinsX extends A with X{
}

on 的是一個(gè)接口:得先實(shí)現(xiàn)這個(gè)接口,然后再mix

class A {
  void a(){
    print("a");
  }
}

mixin X on A{
  void x(){
    print("x");
  }
}

class implA implements A{
  @override
  void a() {}
}

class mixinsX2 extends implA with X{
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容