Middle
Mi az a Completer Dartban, és hogyan lehet használni Flutter fejlesztésben?
sobes.tech MI
Válasz az MI-től
A Completer egy osztály a dart:async könyvtárban, amely lehetővé teszi, hogy később egy Future-t hozzunk létre és fejezzük be egy értékkel vagy hibával. Hasznos, amikor az aszinkron művelet nem ad közvetlenül Future-t, de értesíteni lehet a befejezéséről.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Létrehozunk egy Completer-t a Future<String>-hez
// Aszinkron művelet szimulálása
Future.delayed(Duration(seconds: 2), () {
// Sikeres eredménnyel fejezzük be a Future-t
completer.complete("A művelet sikeresen befejeződött!");
// completer.completeError(StateError("Valami nem stimmelt!")); // vagy hibával
});
print("Várakozás a művelet befejezésére...");
try {
// Kérjük le a Future-t a Completer-ből és várjuk meg a befejeződését
final result = await completer.future;
print("Eredmény: $result");
} catch (e) {
print("Hiba történt: $e");
}
}
A Flutter-ben a Completer gyakran használatos:
- Natív API-kkal való integráció: Amikor a natív kód visszahívást (callback) hív a művelet befejezésekor, a
Completer-t használhatjuk ennek Future-vé alakítására Dart-ban. - Egyedi aszinkron műveletek megvalósítása: Ha olyan aszinkron függvényt kell létrehozni, amely nem használ meglévő Future-okat visszaadó API-kat.
- Izolátumok közötti kommunikáció: A másik izolátumban végzett munka befejezésének jelzésére.
Példa Flutter-ben natív API-val (feltételezett):
import 'dart:async';
import 'package:flutter/services.dart';
class NativeService {
static const platform = MethodChannel('com.example/native_service');
Future<String> performNativeOperation() async {
final completer = Completer<String>();
try {
final result = await platform.invokeMethod('startOperation');
// Feltételezzük, hogy a natív kód meghívja az 'operationCompleted' metódust
// eredménnyel vagy hibával, és ezeket figyeljük.
platform.setMethodCallHandler((call) async {
if (call.method == 'operationCompleted') {
if (call.arguments is String) {
completer.complete(call.arguments as String);
} else if (call.arguments is PlatformException) {
completer.completeError(call.arguments as PlatformException);
} else {
completer.completeError(StateError("Ismeretlen eredmény a natív műveletből"));
}
// A kezelő eltávolítása, ha többé nem szükséges
platform.setMethodCallHandler(null);
}
return true; // Jelezzük, hogy a hívás feldolgozásra került
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Visszaadjuk a Future-t, amely később lesz befejezve
}
}
// A widgetben vagy más helyen:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Natív eredmény: $nativeResult");
// } catch (e) {
// print("Hiba a natív műveletben: $e");
// }