Sobes.tech
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 Completer ishlatilishi 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");
// }