Sobes.tech
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");
// }