一、Dart當中的【..】表示什么意思?
Dart當中的【..】意思是 級聯(lián)操作符,為了方便配置而使用?!?.】 返回的相當于this
二、Dart的作用域
Dart沒有public、private等關(guān)鍵字,默認就是公開的,私有變量使用下劃線_開頭,但是有一個@protected注解
三、Dart是不是單線程模型?是如何運行的?
Dart是單線程模型,運行的流程如下圖

簡單來說,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ū)動機制。

簡單的說,在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{
}