Middle
Dart-də Completer nədir və Flutter inkişafında necə istifadə oluna bilər?
sobes.tech Süni İntellekt
AI-dan cavab
Completer dart:async kitabxanasında mövcud olan və Future yarada bilən və onu daha sonra dəyər və ya səhv ilə tamamlayan sinifdir. Bu, asinxron əməliyyat birbaşa Future qaytarmırsa, lakin onun tamamlandığını bildirmək üçün faydalıdır.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Future<String> üçün Completer yaradılır
// Asinxron əməliyyatın simulyasiyası
Future.delayed(Duration(seconds: 2), () {
// Future-ı uğurlu dəyər ilə tamamlayırıq
completer.complete("Əməliyyat uğurla tamamlandı!");
// completer.completeError(StateError("Nəsə səhv getdi!")); // və ya səhv ilə
});
print("Əməliyyatın tamamlanmasını gözləyirik...");
try {
// Completer-dən Future alın və onun tamamlanmasını gözləyin
final result = await completer.future;
print("Nəticə: $result");
} catch (e) {
print("Xəta baş verdi: $e");
}
}
Flutter-də Completer tez-tez istifadə olunur:
- Native API-lərlə inteqrasiya: Əgər native kod əməliyyatın tamamlandığını bildirmək üçün callback çağırırsa, bunu Dart-da Future-ə çevirmək üçün istifadə edilə bilər.
- Xüsusi asinxron əməliyyatların həyata keçirilməsi: Əgər mövcud Future qaytaran API-lərdən istifadə etməyən asinxron funksiya yaratmaq istəyirsinizsə.
- İzolalar arasında qarşılıqlı əlaqə: Digər izolatda işin tamamlandığını siqnallamaq üçün.
Flutter-də hipotetik native API ilə istifadə nümunəsi:
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');
// Nativ kod 'operationCompleted' metodunu çağıracaq və biz bu çağırışları dinləyirik.
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("Nativ nəticə məlum deyil"));
}
// Handler-i silmək, artıq ehtiyac yoxdursa
platform.setMethodCallHandler(null);
}
return true; // Bu çağırışın işlənildiyini göstərir
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Gecikmiş tamamlanacaq Future-i qaytarır
}
}
// Widget-də və ya başqa yerdə:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Nativ nəticə: $nativeResult");
// } catch (e) {
// print("Nativ əməliyyat xətası: $e");
// }