create<T> method

  1. @override
Future<CombineInfo> create<T>(
  1. IsolateEntryPoint<T> entryPoint, {
  2. T? argument,
  3. String? debugName,
  4. bool errorsAreFatal = true,
  5. RootIsolateToken? isolateToken,
})
override

Implementation

@override
Future<CombineInfo> create<T>(
  IsolateEntryPoint<T> entryPoint, {
  T? argument,
  String? debugName,
  bool errorsAreFatal = true,
  RootIsolateToken? isolateToken,
}) async {
  final receivePort = ReceivePort();
  final isolate = await Isolate.spawn<_IsolateSetup<T>>(
    _runInIsolate<T>,
    _IsolateSetup<T>(
      receivePort.sendPort,
      entryPoint,
      isolateToken ?? _lastUsedIsolateToken,
      argument,
    ),
    debugName: debugName,
    errorsAreFatal: errorsAreFatal,
  );

  final receivePortStream = receivePort.asBroadcastStream().cast<Object?>();
  final SendPort sendPort = await receivePortStream.first as dynamic;

  final isolateMessenger = NativeInternalIsolateMessenger(
    sendPort,
    receivePortStream,
  );

  final binaryMessengerMiddleware = UIBinaryMessengerMiddleware(
    ServicesBinding.instance.defaultBinaryMessenger,
    isolateMessenger,
  )..initialize();
  return CombineInfo(
    isolate: NativeCombineIsolate(
      isolate,
      () {
        binaryMessengerMiddleware.dispose();
        isolateMessenger.markAsClosed();
      },
    ),
    messenger: isolateMessenger.toIsolateMessenger(),
  );
}