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
Completerkullanı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");
// }