Middle
Dartda Completer nima va uni Flutter dasturlashda qanday ishlatish mumkin?
sobes.tech AI
AIdan javob
Completer dart:async kutubxonasida mavjud bo'lib, Future yaratishga va uni keyinchalik qiymat yoki xato bilan yakunlashga imkon beradi. Bu asinxron operatsiya to'g'ridan-to'g'ri Future qaytarmagan hollarda, uni yakunlanganligini bildirish uchun foydalidir.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Future<String> uchun Completer yaratamiz
// Asinxron operatsiyaning simulyatsiyasi
Future.delayed(Duration(seconds: 2), () {
// Future'ni muvaffaqiyatli qiymat bilan yakunlaymiz
completer.complete("Operatsiya muvaffaqiyatli yakunlandi!");
// completer.completeError(StateError("Nimadir noto'g'ri ketdi!")); // Yoki xato bilan
});
print("Operatsiya yakunlanishini kutmoqdamiz...");
try {
// Completer'dan Future'ni olamiz va uning yakunlanishini kutamiz
final result = await completer.future;
print("Natija: $result");
} catch (e) {
print("Xatolik yuz berdi: $e");
}
}
Flutterda Completer ko'pincha quyidagi maqsadlarda ishlatiladi:
- Nativ API bilan integratsiya: Nativ kod operatsiya tugagach callback chaqirsa, uni Dartda Future ga aylantirish uchun
Completerishlatilishi mumkin. - Maxsus asinxron operatsiyalarni amalga oshirish: Agar mavjud Future qaytaradigan APIlardan foydalanmaydigan asinxron funktsiya yaratish kerak bo'lsa.
- Izolatlar o'rtasida o'zaro ta'sir: Boshqa izolatda ish yakunlanganligini bildirish uchun.
Nativ API bilan Flutterda foydalanish misoli (hipotetik):
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' metodini chaqiradi deb faraz qilinadi
// va biz bu chaqiruvlarni tinglaymiz.
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 natija noma'lum"));
}
// Handlerni olib tashlash, agar endi kerak bo'lmasa
platform.setMethodCallHandler(null);
}
return true; // Bu chaqiruvni boshqarilganligini bildiradi
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Keyinchalik yakunlanadigan Future'ni qaytaradi
}
}
// Widgetda yoki boshqa joyda:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Nativ natija: $nativeResult");
// } catch (e) {
// print("Nativ operatsiya xatosi: $e");
// }