如何将参数(除了 SendPort)传递给 Dart 中生成的隔离

How to pass arguments (besides SendPort) to a spawned isolate in Dart

this article 中,他们产生了这样的分离物:

import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  final isolate = await Isolate.spawn(
    downloadAndCompressTheInternet,
    receivePort.sendPort,
  );
  receivePort.listen((message) {
    print(message);
    receivePort.close();
    isolate.kill();
  });
}

void downloadAndCompressTheInternet(SendPort sendPort) {
  sendPort.send(42);
}

但是我只能传入接收端口。如何传入其他参数?

我找到了答案,所以我将其张贴在下面。

由于只能传入一个参数,所以可以将参数做成list或者map。其中一项是 SendPort,其他项是您要为函数提供的参数:

Future<void> main() async {
  final receivePort = ReceivePort();
  
  final isolate = await Isolate.spawn(
    downloadAndCompressTheInternet,
    [receivePort.sendPort, 3],
  );
  
  receivePort.listen((message) {
    print(message);
    receivePort.close();
    isolate.kill();
  });
  
}

void downloadAndCompressTheInternet(List<Object> arguments) {
  SendPort sendPort = arguments[0];
  int number = arguments[1];
  sendPort.send(42 + number);
}

你这样失去了类型安全,但你可以根据需要在方法中检查类型。

我们可以通过创建带有字段

的自定义class恢复类型安全
class RequiredArgs {
   final SendPort sendPort;
   final int id;
   final String name;

   RequiredArgs(this.sendPort, this.id, this.name);
 }

void downloadAndCompressTheInternet(RequiredArgs args) {
  final sendPort = args.sendPort;
  final id = args.id;
  final name = args.name;

  sendPort.send("Hello $id:$name");
}

这样代码会更干净、更安全