Sobes.tech
Middle

Kas ir Completer Dart un kā to var izmantot Flutter izstrādē?

sobes.tech AI

Atbilde no AI

Completer ir klases dart:async bibliotēkā, kas ļauj izveidot Future un to vēlāk pabeigt ar kādu vērtību vai kļūdu. Tas ir noderīgi, kad asīnhroniska operācija tieši neatgriež Future, bet par tās pabeigšanu var tikt saņemta informācija.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Izveidojam Completer priekš Future<String>

  // Asīnhroniskas operācijas imitācija
  Future.delayed(Duration(seconds: 2), () {
    // Pabeidzam Future ar veiksmīgu vērtību
    completer.complete("Operācija veiksmīgi pabeigta!");
    // completer.completeError(StateError("Kas notika ne tā!")); // vai ar kļūdu
  });

  print("Gaidām operācijas pabeigšanu...");

  try {
    // Saņemam Future no Completer un gaidām tā pabeigšanu
    final result = await completer.future;
    print("Rezultāts: $result");
  } catch (e) {
    print("Kļūda: $e");
  }
}

Flutter Completer bieži tiek izmantots:

  • Integrācijai ar nativajiem API: Kad nativais kods izsauc atpakaļ zvanu (callback) operācijas beigās, to var pārvērst par Future Dart valodā, izmantojot Completer.
  • Pašu izstrādātu asīnhronisko operāciju realizācijai: Ja nepieciešams izveidot asīnhronisku funkciju, kas neizmanto esošos Future API.
  • Saskarsmei starp izolātiem: Signāla nosūtīšanai par darba pabeigšanu citā izolātā.

Piemērs Flutter ar nativā API (hipotētisks):

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

      // Pieņem, ka nativais kods izsauks 'operationCompleted' metodi
      // ar rezultātu vai kļūdu, un mēs klausāmies šos izsaukumus.
      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("Nezināms rezultāts nativajā operācijā"));
          }
          // Noņemt handler, ja tas vairs nav nepieciešams
          platform.setMethodCallHandler(null);
        }
        return true; // Norādām, ka izsaukums ir apstrādāts
      });

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

    return completer.future; // Atgriež Future, kas tiks pabeigts vēlāk
  }
}
// Widget vai citur:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("Nativais rezultāts: $nativeResult");
// } catch (e) {
//   print("Kļūda nativajā operācijā: $e");
// }