Flutter的优点:
-
Flutter在Rlease模式下直接将Dart编译成本地机器码,避免了代码解释运行的性能消耗。
-
Dart本身针对高频率循环刷新(如屏幕每秒60帧)在内存层面进行了优化,使得Dart运行时在屏幕绘制实现如鱼得水。
-
Flutter实现了自己的图形绘制避免了Native桥接。
Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。
Flutter的体系结构:
事件队列
和其他系统一样,在Dart
的线程中也存在事件循环和消息队列的概念,但在Dart中线程叫做isolate
。应用程序启动后,开始执行main函数并运行main isolate
。
每个isolate包含一个事件循环以及两个事件队列,event loop
事件循环,以及event queue
和microtask queue
事件队列,event和microtask队列有点类似iOS的source0
和source1
。
source1 :苹果创bai建用来接受系统发出事件,当du手机发生一个触摸,摇晃或锁屏zhi等系统dao,这时候系统会发送一个事件到app进程(进程通信),这也就是为什么叫基于port传递source1的原因,port就是进程端口嘛,该事件可以激活进程里线程的runloop,比如你点击一下app的按钮或屏幕,runloop就醒过来处理触摸事件,你可以做个实验,在主线程的runloop中添加一个CFRunLoopObserverRef,用switch输出runloop6个状态,这时候你每点击一次屏幕,他就会输出Runloop六个状态,然后进入休眠。
source0 :执行performSelectors方法,假如你在主线程performSelectors一个任务到子线程,这时候就是在代码中发送事件到子线程的runloop,这时候如果子线程开启了runloop就会执行该任务,注意该performSelector方法只有在你子线程开启runloop才能执行,如果你没有在子线程中开启runloop,那么该操作会无法执行并崩溃。
-
event queue:负责处理I/O事件、绘制事件、手势事件、接收其他isolate消息等外部事件。
-
microtask queue:可以自己向isolate内部添加事件,事件的优先级比event queue高。
这两个队列也是有优先级的,当isolate
开始执行后,会先处理microtask
的事件,当microtask
队列中没有事件后,才会处理event
队列中的事件,并按照这个顺序反复执行。但需要注意的是,当执行microtask
事件时,会阻塞event
队列的事件执行,这样就会导致渲染、手势响应等event
事件响应延时。为了保证渲染和手势响应,应该尽量将耗时操作放在event
队列中。
异步调用 - async、await
在异步调用中有三个关键词,async
、await
、Future
,其中async和await需要一起使用。在Dart中可以通过async和await进行异步操作,async表示开启一个异步操作,也可以返回一个Future结果。如果没有返回值,则默认返回一个返回值为null的Future。
async、await本质上就是Dart对异步操作的一个语法糖,可以减少异步调用的嵌套调用,并且由async修饰后返回一个Future,外界可以以链式调用的方式调用。这个语法是JS的ES7标准中推出的,Dart的设计和JS相同。
使用示例:
网络请求的方法
Future<HttpClientResponse> dataRequest() async {
//创建一个HttpClient
HttpClient httpClient = HttpClient();
//打开Http连接
HttpClientRequest request = await httpClient.getUrl(Uri.parse("http://www.baidu.com"));
HttpClientResponse response = await request.close();
return response;
}
Future<String> loadData() async {
HttpClientResponse response = await dataRequest();
return response.transform(utf8.decoder).join();
}
使用:
@override
void initState() {
super.initState();
loadData().then((value) {
setState(() {
_content = value;
});
});
}
在代码示例中,执行到loadData
方法时,会同步进入方法内部进行执行,当执行到await
时就会停止async
内部的执行,从而继续执行外面的代码。当