import 'dart:async'; import 'dart:isolate'; import 'dart:ui'; import 'package:flutter/services.dart'; /// Ein PortController mit verschiedenen FUnktionen zur KOmmunikations zwischen /// main und anderen Isolates class PortController { /// Gibt eine Instanz dieser Klasse zurück factory PortController() => _instance; PortController._internal() { if (ServicesBinding.rootIsolateToken != null) { _registerRootIsolateTokenSender(); } } static final PortController _instance = PortController._internal(); /// Fügt einen Port mit [name] zum NameServer hinzu void addPort(final SendPort sendPort, final String name) { IsolateNameServer.registerPortWithName(sendPort, name); } /// Gibt einen Port mit [name] vom NameServer zurück, falls gefunden SendPort? getPort(final String name) => IsolateNameServer.lookupPortByName(name); /// Gibt das [RootIsolateToken] der main-Isolate zurück Future getRootIsolateToken() async { final ReceivePort receivePort = ReceivePort(); final SendPort? rootPort = IsolateNameServer.lookupPortByName( 'root-isolate-token', ); if (rootPort == null) { receivePort.close(); return null; } rootPort.send(receivePort.sendPort); try { final dynamic message = await receivePort.first; if (message is RootIsolateToken) { return message; } return null; } finally { receivePort.close(); } } void _registerRootIsolateTokenSender() { final ReceivePort receivePort = ReceivePort() ..listen((final value) { if (value is SendPort) { value.send(ServicesBinding.rootIsolateToken); } }); addPort(receivePort.sendPort, 'root-isolate-token'); } }