如何将参数(除了 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");
}
这样代码会更干净、更安全
在 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");
}
这样代码会更干净、更安全