Feat: Erstellt die Möglichkeit, Tasks als Hintergrundprozesse auszuführen
This commit is contained in:
68
lib/Controller/port_controller.dart
Normal file
68
lib/Controller/port_controller.dart
Normal file
@@ -0,0 +1,68 @@
|
||||
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<RootIsolateToken?> 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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user