如何获取对已经 运行 隔离的引用?

How to get a reference to an already running isolate?

如何在 Flutter 应用程序启动期间获取对已经 运行ning 隔离的引用?

想象一个 Futter 应用程序在 Isolate 中执行其所有工作。 Isolate 可以 运行 持续将近一个小时,即使该应用程序已置于后台(顺便说一句,目前运行良好)。如果在 isolate 已经 运行ning 时再次启动应用程序,就会出现问题,这会导致应用程序挂起。

所以问题是,如何检测 isolate 是否已经 运行ning,以及如何获取它的句柄?

由于我的评论没有得到提问者的回复,我在这里提供更详细的建议。欢迎大家评论,我会根据反馈进行更新。

首先,尝试简单地按照教程进行操作:https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124

其次,IsolateNameServer 似乎很有希望。查看它的实现,我们看到:

class IsolateNameServer {

...
  static SendPort? lookupPortByName(String name) {
...
    return _lookupPortByName(name);
  }

...

  static SendPort? _lookupPortByName(String name)
      native 'IsolateNameServerNatives_LookupPortByName';
  static bool _registerPortWithName(SendPort port, String name)
      native 'IsolateNameServerNatives_RegisterPortWithName';
  static bool _removePortNameMapping(String name)
      native 'IsolateNameServerNatives_RemovePortNameMapping'
}

和 C++ 代码:https://blog.weghos.com/flutter/engine/flutter/lib/ui/isolate_name_server/isolate_name_server_natives.cc.html

...
Dart_Handle IsolateNameServerNatives::LookupPortByName(
    const std::string& name) {
  auto name_server = UIDartState::Current()->GetIsolateNameServer();
  if (!name_server) {
    return Dart_Null();
  }
  Dart_Port port = name_server->LookupIsolatePortByName(name);
  if (port == ILLEGAL_PORT) {
    return Dart_Null();
  }
  return Dart_NewSendPort(port);
}
...

因此,它没有在 Dart 中实现,而是在本地实现,所以可能后台 isolate 可以注册自己,主 isolate 可以使用它来找到它。

试试看,如果不行,请评论,我会更新。