一、Dart当中的【..】表示什么意思?
Dart当中的【..】意思是 级联操作符,为了方便配置而使用。【..】 返回的相当于this
二、Dart的作用域
Dart没有public、private等关键字,默认就是公开的,私有变量使用下划线_开头,但是有一个@protected注解
三、Dart是不是单线程模型?是如何运行的?
Dart是单线程模型,运行的流程如下图
简单来说,Dart在单线程中是以消息循环机制来运行的,包含两个任务队列,一个是‘微型任务队列’microtask queue,另一个叫做‘事件队列’event queue。
当Flutter应用启动后,消息循环机制便启动了。首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕再去执行微任务,如此玄幻往复,生生不息。
四、Dart是如何实现多任务并行的?
前面说过,Dart是单线程的,不存在多线程,那如何进行多任务并行的呢?其实Dart的多线程和前端的多线程有很多相似之处。Flutter的多线程主要依赖Dart的并发编程、异步和事件驱动机制。
简单的说,在Dart中,一个Isolate(被隔离的)对象其实就是一个isolate执行环境的引用,一般来说我们都是通过当前的isolate去控制其他的isolate完成彼此之间的交互,而当我们想要创建一个新的Isolate可以使用Isolate.spawn方法获取返回的一个新的isolate对象,两个isolate之间使用sendPort相互发送消息,而isolate中也存在了一个与之对应的ReceivePort接收消息来处理,但是我们需要注意的是,ReceivePort和SendPort在每个isolate都有一对,只有同一个isolate中的ReceivePort才能接收到当前类的SendPort发送的消息并且处理。
五、说一下Dart异步编程中的Future关键字?
前面说过,Dart在单线程中一消息循环机制来运行的,其中包含连个队列,一个是‘微型任务队列’microtask queue, 另一个叫做'事件队列' event queue
在Dart中,执行一个异步任务可以使用Future来处理。在Dart的每一个Isolate中,执行的优先级为:Main > MicroTask > EventQueue
六、说一下Dart异步编程中的Stream数据流?
在Dart中,Stream和Future一样,都是用来处理异步编程的工具。他们的区别在于,Stream可以接收多个异步结果,而Future只有一个。
Stream的创建可以使用Stream.fromFuture. 也可以使用StreamController来创建和控制。还有一个注意点:普通的Stream只有一个订阅者,如果想要有多个订阅的话,要使用asBroadcastStream().
七、Stream有哪两种订阅模式?分别是怎么调用的?
Stream有两种订阅模式:单订阅(single)和多订阅(brodcast)。单订阅就是只能有一个订阅者,而广播是可以有多个订阅者。这就类似于消息服务的处理模式。单订阅类似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后才会转交给它。而广播类似于发布订阅模式,可以同时有多个订阅者,当有数据就会传递给所有的订阅者,而不管当前是否已有订阅者存在。
Stream默认处于单订阅模式,所以同一个stream上的listen和其他大多数方法只能调用一次,调用第二次就会报错。但Stream可以通过transform()方法(返回另一个Stream
)进行连续调用。通过Stream.asBroadcastStream() 可以将一个单订阅模式的Stream转换成一个多订阅模式的Stream,isBroadcast属性可以判断当前Stream所处的模式。
八、await for 如何使用?
await for 是不断获取stream流中的数据,然后执行循环体中的操作。它一般用在知道stream什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞。
sss() async {
Stream steam = new Stream.fromIterable([
'不开心',
'面试',
'没'
]);
await for (String item in steam) {
print(item);
}
}
九、说一下mixin机制?
mixin是Dart2.1加入的特性,以前版本通常使用abstract class代替。简单来说,mixin是为了解决继承方面的问题而引入的机制,Dart为了支持多重继承,引入了mixin关键字,他的最大特殊在于:mixin定义的类不能有构造方法,这样可以避免继承多个类而产生的父类构造器方法冲突。
mixins的对象是类,mixins绝不是继承,也不是接口,而是一种全新的特性,可以mixins多个类,mixins的使用需要满足一定的条件。
十、Dart中const与final的区别
- final :表明这个变量不能再发生变化,是常量的意思,但是具体变量的值是在运行时才能确定的。一旦初始化,则不允许再次发生更改。
- const: const定义时,需要是个明确的值,在编译期间就确定了值。一旦初始化,也不能更改。
十一、Flutter中的key
参考:https://www.jianshu.com/p/5d8ace3d411a
十二、mixin extends implement 之间的关系?
继承(关键字extends)、混入mixins(关键字with)、接口实现(关键字 implements)。这三者可以同时存在,前后顺序是extends -> mixins -> implements
Flutter中继承是单继承,子类重写超类的方法要用@Override,子类调用超类的方法要用super。
在Flutter中,Mixins是一种在多个类层次结构中复用类代码的方法。mixins的对象是类,mixins绝不是继承,也不是接口,而是一种全新的特性,可以mixins多个类,mixins的使用需要满足一定条件。
十三、使用mixins的条件是什么?
因为mixns使用的条件,随着Dart版本一直在变,这里讲Dart2.1中使用的mixins的条件:
mixins类只能继承自object
mixins类不能有构造函数
一个类可以mixins多个mixins类
可以mixins多个类,不破坏Flutter的单继承
十四、mixin怎么指定异常类型?
on关键字可用于指定异常类型。on只能用于被mixins标记的类,例如mixins X on A,意思是mixins X的话,得先接口实现或继承A。这里A可以是类,也可以是接口,但是在mixins的时候用法有区别。
on一个类:
class A {
void a(){
print("a");
}
}
mixin X on A{
void x(){
print("x");
}
}
class mixinsX extends A with X{
}
on 的是一个接口:得先实现这个接口,然后再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{
}