Sobes.tech
Middle

Mis on Completer Dartis ja kuidas seda saab kasutada Flutter arenduses?

sobes.tech AI

Vastus AI-lt

Completer on klass dart:async raamatukogus, mis võimaldab luua Future ja seda hiljem lõpetada mingi väärtuse või veaga. See on kasulik, kui asünkroonne operatsioon ei tagasta otse Future-d, kuid selle lõpetamisest saab teavitada.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Loome Completer Future<String>-i jaoks

  // Asünkroonse operatsiooni simulatsioon
  Future.delayed(Duration(seconds: 2), () {
    // Lõpetame Future edukalt väärtusega
    completer.complete("Operatsioon edukalt lõpetatud!");
    // completer.completeError(StateError("Midagi läks valesti!")); // või veaga
  });

  print("Ootame operatsiooni lõpetamist...");

  try {
    // Saame Future Completer-ist ja ootame selle lõpetamist
    final result = await completer.future;
    print("Tulemus: $result");
  } catch (e) {
    print("Viga: $e");
  }
}

Flutteris kasutatakse Completer sageli:

  • Integratsiooniks natiivsete API-dega: Kui natiivkood kutsub tagasi (callback) operatsiooni lõpetamisel, saab seda kasutada Completer-i abil selle Future-ks muutmiseks Dartis.
  • Kohandatud asünkroonsete operatsioonide realiseerimiseks: Kui on vaja luua asünkroonne funktsioon, mis ei kasuta olemasolevaid Future-teenuseid.
  • Suhtluseks isolaatide vahel: Signaali andmiseks teise isolaadi töö lõpetamise kohta.

Näide Flutteris natiivse API-ga (hüpoteetiline):

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

      // Eeldatakse, et natiivkood kutsub välja 'operationCompleted'
      // tulemusega või veaga, ja me kuulame neid kutseid.
      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("Tundmatu tulemus natiivoperatsioonist"));
          }
          // Eemalda käsitleja, kui see enam ei ole vajalik
          platform.setMethodCallHandler(null);
        }
        return true; // Märgime, et kutse on töödeldud
      });

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

    return completer.future; // Tagastame Future, mis lõpetatakse hiljem
  }
}
// Widgetis või mujal:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("Natiivne tulemus: $nativeResult");
// } catch (e) {
//   print("Natiivse operatsiooni viga: $e");
// }