Dart面試總結(jié)

一、Dart當中的【..】表示什么意思?

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

二、Dart的作用域

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

三、Dart是不是單線程模型?是如何運行的?

Dart是單線程模型,運行的流程如下圖


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

簡單來說,Dart在單線程中是以消息循環(huán)機制來運行的,包含兩個任務(wù)隊列,一個是‘微型任務(wù)隊列’microtask queue,另一個叫做‘事件隊列’event queue。

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

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

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

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

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

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

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

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

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

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

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

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

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

八、await for 如何使用?

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

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

九、說一下mixin機制?

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

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

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

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

十一、Flutter中的key

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

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

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

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

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

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

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

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

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

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


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


class mixinsX extends A with X{
}

on 的是一個接口:得先實現(xiàn)這個接口,然后再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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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