Sobes.tech
Middle

Kas yra Completer Dart ir kaip jį galima naudoti Flutter kūrime?

sobes.tech AI

Atsakymas iš AI

Completer yra klasė dart:async bibliotekoje, leidžianti sukurti Future ir vėliau jį užbaigti su tam tikra reikšme arba klaida. Ji naudinga, kai asinchroninė operacija tiesiogiai negrąžina Future, bet gali būti pranešta apie jos užbaigimą.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Sukuriame Completer, skirtą Future<String>

  // Asinchroninės operacijos imitacija
  Future.delayed(Duration(seconds: 2), () {
    // Užbaigiame Future sėkminga reikšme
    completer.complete("Operacija sėkmingai užbaigta!");
    // completer.completeError(StateError("Kažkas nepavyko!")); // arba su klaida
  });

  print("Laukiame operacijos užbaigimo...");

  try {
    // Gauname Future iš Completer ir laukiame jo užbaigimo
    final result = await completer.future;
    print("Rezultatas: $result");
  } catch (e) {
    print("Įvyko klaida: $e");
  }
}

Flutter'e Completer dažnai naudojamas:

  • Integracijai su natyviniais API: Kai natyvinis kodas iškviečia atgalinį kvietimą (callback) operacijos pabaigoje, galima naudoti Completer šiam callback'ui paversti į Future Dart'e.
  • Sukurti savo asinchronines operacijas: Jei reikia sukurti asinchroninę funkciją, kuri nenaudoja esamų Future grąžinančių API.
  • Sąveikai tarp izoliatorių: Signalizacijai apie darbo pabaigą kitoje izoliatoriuje.

Pavyzdys naudojimo Flutter'e su natyviniais API (hipotetinis):

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

      // Tikimasi, kad natyvinis kodas iškvies 'operationCompleted' metodą
      // su rezultatu arba klaida, ir mes stebėsime šiuos iškvietimus.
      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("Nežinomas natyvios operacijos rezultatas"));
          }
          // Pašalinti handler'į, jei jis daugiau nereikalingas
          platform.setMethodCallHandler(null);
        }
        return true; // Nurodome, kad iškvietimas apdorotas
      });

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

    return completer.future; // Grąžiname Future, kuris bus užbaigtas vėliau
  }
}
// Widget'e arba kitur:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("Natyvinis rezultatas: $nativeResult");
// } catch (e) {
//   print("Natyvinės operacijos klaida: $e");
// }