Wie erstellt man zwei Threads in Dart im Kontext von Flutter?
sobes.tech KI
Antwort von AI
Um Isolat in Dart/Flutter ist eine separate Aufgabe mit eigenem Speicherraum, die unabhängig vom Hauptthread läuft. Sie werden verwendet, um langwierige oder ressourcenintensive Operationen im Hintergrund auszuführen, ohne die Benutzeroberfläche zu blockieren.
Es gibt mehrere Möglichkeiten, Isolate zu erstellen und mit ihnen zu interagieren:
-
Isolate.spawn(): Die Low-Level-Methode zur Erstellung eines Isolats. Sie erfordert die Übergabe einer Funktion oder einer statischen Methode sowie eines Ports für die Kommunikation.import 'dart:isolate'; // Funktion, die im Isolat ausgeführt wird void isolateEntry(SendPort sendPort) { int result = 0; for (int i = 0; i < 1000000000; i++) { result += i; } sendPort.send(result); } void main() async { ReceivePort receivePort = ReceivePort(); Isolate isolate = await Isolate.spawn(isolateEntry, receivePort.sendPort); receivePort.listen((message) { print('Ergebnis des Isolats: $message'); isolate.kill(); }); print('Hauptthread läuft weiter...'); } -
compute(): Eine vereinfachte Funktion aus demflutter/foundation-Paket, dieIsolate.spawn()intern verwendet. Ideal für einfache Hintergrundaufgaben.import 'package:flutter/foundation.dart'; int heavyComputation(int limit) { int result = 0; for (int i = 0; i < limit; i++) { result += i; } return result; } void main() async { int result = await compute(heavyComputation, 1000000000); print('Berechnungsergebnis: $result'); } -
Isolate.spawnUri(): Wird verwendet, um Code aus einer separaten Dart-Datei in einem neuen Isolat auszuführen.
Interaktion zwischen Isolaten:
Isolate kommunizieren nur durch das Senden von Nachrichten über SendPort und ReceivePort. Diese Operationen sind atomar.
SendPort: Zum Senden von Nachrichten an ein anderes Isolat.ReceivePort: Zum Empfangen von Nachrichten.
Objekte, die zwischen Isolaten übertragen werden, müssen "übertragbar" sein, d.h. sie müssen einfache Datentypen, Listen, Maps oder serialisierbare Flutter-Typen sein.
Nicht übertragbare Objekte werden kopiert, und Änderungen in einem Isolat wirken sich nicht auf das andere aus.
Wichtige Punkte:
- Isolate können nicht direkt auf den Speicher des anderen zugreifen.
- Sie haben keinen Zugriff auf den gemeinsamen Zustand, Variablen, Klassen oder Widgets des Hauptisolats.
- Die Kommunikation ist asynchron.
- Es ist wichtig, das Lebenszyklusmanagement der Isolate zu beachten, z.B.
isolate.kill()bei Bedarf.
Der Einsatz von Isolates ermöglicht die Ausführung langwieriger oder ressourcenintensiver Operationen im Hintergrund, ohne die UI zu blockieren.