Sobes.tech
Middle

Dart'ta Completer nedir ve Flutter geliştirmede nasıl kullanılabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Completer, dart:async kütüphanesinde bulunan ve bir Future oluşturup daha sonra bir değer veya hata ile tamamlamaya imkan tanıyan bir sınıftır. Asenkron bir işlem doğrudan bir Future döndürmüyorsa, ancak onun tamamlandığı bildirilmek isteniyorsa kullanışlıdır.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Future<String> için bir Completer oluşturuyoruz

  // Asenkron bir işlemin simülasyonu
  Future.delayed(Duration(seconds: 2), () {
    // Future'ı başarılı bir değerle tamamla
    completer.complete("İşlem başarıyla tamamlandı!");
    // completer.completeError(StateError("Bir şeyler ters gitti!")); // veya hata ile
  });

  print("İşlemin tamamlanmasını bekliyoruz...");

  try {
    // Completer'dan Future'ı al ve tamamlanmasını bekle
    final result = await completer.future;
    print("Sonuç: $result");
  } catch (e) {
    print("Bir hata oluştu: $e");
  }
}

Flutter'da Completer genellikle şu amaçlarla kullanılır:

  • Yerel API'lerle entegrasyon: Yerel kod, işlemin tamamlandığında bir callback çağırıyorsa, bunu Dart'ta Future'a dönüştürmek için Completer kullanılabilir.
  • Özelleştirilmiş asenkron işlemler: Var olan Future döndüren API'leri kullanmayan asenkron fonksiyonlar oluşturmak istiyorsanız.
  • İzolalar arası iletişim: Diğer bir izolatın işinin tamamlandığını bildirmek için.

Örnek kullanım Flutter'da yerel API ile (varsayımsal):

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

      // Yerel kodun 'operationCompleted' metodunu çağırması beklenir
      // ve bu çağrıları dinliyoruz.
      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("Bilinmeyen yerel sonuç"));
          }
          // Artık gerekliyse handler'ı kaldır
          platform.setMethodCallHandler(null);
        }
        return true; // Çağrının işlendiğini belirtir
      });

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

    return completer.future; // Daha sonra tamamlanacak Future'ı döndürür
  }
}

// Widget'ta veya başka bir yerde:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("Yerel sonuç: $nativeResult");
// } catch (e) {
//   print("Yerel işlem hatası: $e");
// }