使用多线程的目的是为了避免长时间执行的任务影响UI线程绘制界面,造成界面卡顿,影响用户体验(开发者自身也是第一个用户,所以尤为重要)。
首先引入dart:isolate包
import 'dart:isolate';
在需要使用isolate的 async 函数中初始化ReceivePort 即接收端
ReceivePort receivePort = ReceivePort();
注意:本例中不需要调用isolate实例的方法或者isolate.controlPort获取SendPort
var isolate = await Isolate.spawn(runGetDirectorySize, receivePort.sendPort,
onExit: receivePort.sendPort);
receivePort.listen((data) {
_scan(data);
});
分步拆解:
Isolate.spawn
接受一个void Function(T),在本例中runGetDirectorySize来获取文件目录大小. 这里的T即为receivePort.sendPort
也就是我们调用Isolate.spawn的第二个参数。
同时我们传入一个onExit:receivePort.sendPort可选参数,
当runGetDirectorySize执行完毕退出时会给这个receivePort.sendPort发送一个null数据,此时我们可以根据receivePort.listen接收到的data是否为null来判断线程是否执行完毕,比如执行完后更新ui显示目录大小或者为空。
void runGetDirectorySize(SendPort sendPort) {
filesInDirectoryWithDepth(
Directory(userHome), FileSystemEntityType.directory, 0, 4, sendPort);
}