Sobes.tech
Middle

Ce este un Completer în Dart și cum poate fi utilizat în dezvoltarea Flutter?

sobes.tech AI

Răspuns de la AI

Completer este o clasă în biblioteca dart:async care permite crearea unui Future și finalizarea sa ulterior cu o valoare sau o eroare. Este util atunci când o operație asincronă nu returnează direct un Future, dar poate fi notificată despre finalizarea sa.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Creăm un Completer pentru Future<String>

  // Simulare a unei operații asincrone
  Future.delayed(Duration(seconds: 2), () {
    // Finalizăm Future cu o valoare de succes
    completer.complete("Operație finalizată cu succes!");
    // completer.completeError(StateError("Ceva nu a mers bine!")); // Sau cu o eroare
  });

  print("Așteptăm finalizarea operației...");

  try {
    // Obținem Future-ul din Completer și așteptăm finalizarea
    final result = await completer.future;
    print("Rezultat: $result");
  } catch (e) {
    print("A apărut o eroare: $e");
  }
}

În Flutter, Completer este adesea folosit pentru:

  • Integrare cu API native: Când codul nativ apelează un callback la finalizarea unei operații, se poate folosi Completer pentru a-l converti într-un Future în Dart.
  • Implementarea operațiilor asincrone personalizate: Dacă trebuie să creezi o funcție asincronă care nu folosește API-uri existente care returnează Future.
  • Interacțiunea între izolate: Pentru a semnala finalizarea muncii într-un alt izolat.

Exemplu de utilizare în Flutter cu un API nativ (ipotetic):

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');

      // Se presupune că codul nativ va apela metoda 'operationCompleted'
      // cu rezultatul sau eroarea, și ascultăm aceste apeluri.
      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("Rezultat nativ necunoscut"));
          }
          // Eliminăm handler-ul dacă nu mai este necesar
          platform.setMethodCallHandler(null);
        }
        return true; // Indică că apelul a fost gestionat
      });

    } on PlatformException catch (e) {
      completer.completeError(e);
    }

    return completer.future; // Returnează Future-ul care va fi finalizat mai târziu
  }
}

// În widget sau alt loc:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("Rezultatul nativ: $nativeResult");
// } catch (e) {
//   print("Eroare la operația nativă: $e");
// }