dart flutter中的多线程isolate包的使用

使用多线程的目的是为了避免长时间执行的任务影响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);
}