繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM