![](/img/trans.png)
[英]Send platform message to Android method from background flutter isolate
[英]Flutter Isolate receives only the initial message
我正在尝试使用将发送请求的Isolate
,以免阻塞主线程/隔离。
使用 so 后,生成的Isolate
的函数仅在初始传递的消息上调用一次。
final isolate = await Isolate.spawn<Animal>((animal) {
print('received ${animal.name}');
}, Animal("Foo"));
打印: flutter: received Foo
但是再添加一些什么也没有显示:
print('Sending bar');
isolate.controlPort.send(Animal("Bar"));
print('Sending test');
isolate.controlPort.send(Animal("Test"));
sleep(const Duration(seconds: 10));
flutter: Sending bar
flutter: Sending test
flutter: received Foo
在阅读了Isolate::spawn()
的文档后,我通过向 Isolate 发送一个SendPort
来实现这一点,该Isolate
的处理程序发送自己的SendPort
以便主隔离最终能够发送消息。
在行动:
import 'dart:io';
import 'dart:isolate';
void main() async {
final recvPort = ReceivePort();
await Isolate.spawn<SendPort>((port) {
print('[2] received port');
final recvMsg = ReceivePort();
port.send(recvMsg.sendPort);
print('[2] sent my port');
recvMsg.listen((message) {
print('[2] Received ${message.name}');
});
}, recvPort.sendPort);
final sendPort = await recvPort.first;
print('[1] Sending bar');
sendPort.send(Animal("Bar"));
print('[1] Sending test');
sendPort.send(Animal("Test"));
sleep(const Duration(seconds: 5));
exit(0);
}
class Animal {
final String name;
Animal(this.name);
}
结果是:
Results in:
[2] received port
[2] sent my port
[1] Sending bar
[1] Sending test
[2] Received Bar
[2] Received Test
Process finished with exit code 0
正如文档中详述的那样,这实际上是用于隔离之间的双向通信,但这是我在用例中工作的唯一方式(单向)。
对于双向通信,我创建了一个要点,它简单地将recvPort
转换为广播流,以便在接收实际消息之前首先接收隔离的SendPort
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.