Sobes.tech
Middle

რა არის Completer Dart-ში და როგორ შეიძლება ის გამოყენებულ იქნას Flutter-ის განვითარებაში?

sobes.tech AI

პასუხი AI-სგან

Completer — ეს კლასია dart:async ბიბლიოთეკაში, რომელიც საშუალებას იძლევა შექმნათ Future და დაასრულოთ იგი მოგვიანებით გარკვეული მნიშვნელობით ან შეცდომით. იგი სასარგებლოა, როდესაც ასინქრონული ოპერაცია პირდაპირ არ აბრუნებს Future-ს, მაგრამ შეიძლება იყოს შეტყობინებული მისი დასრულების შესახებ.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // ქმნით Completer-ს Future<String>-ისთვის

  // ასინქრონული ოპერაციის იმიტაცია
  Future.delayed(Duration(seconds: 2), () {
    // წარმატებით დასრულება
    completer.complete("ოპერაცია წარმატებით დასრულდა!");
    // completer.completeError(StateError("რაღაც მოხდა!")); // ან შეცდომით
  });

  print("მოველით ოპერაციის დასრულებას...");

  try {
    // იღებთ Future-ს Completer-დან და ელით მის დასრულებას
    final result = await completer.future;
    print("შედეგი: $result");
  } catch (e) {
    print("შეცდომა მოხდა: $e");
  }
}

Flutter-ში Completer ხშირად გამოიყენება:

  • ინტეგრაციის ნატიური API-ებთან: როდესაც ნატიური კოდი ახორციელებს callback-ს ოპერაციის დასრულებაზე, შეიძლება გამოიყენოს Completer ამ callback-ის Future-ად გარდაქმნისთვის.
  • მოწოდებული ასინქრონული ოპერაციების რეალიზაცია: თუ საჭიროა შექმნათ ასინქრონული ფუნქცია, რომელიც არ იყენებს არსებული Future-ებს, რომლებიც აბრუნებენ API-ებს.
  • ინტერაქცია იზოლატებს შორის: სხვა იზოლატში მუშაობის დასრულების ნიშნულის ნიშნულისთვის.

მაგალითი Flutter-ში ნატიური API-სთან (ჰიპოთეტური):

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

      // ვივარაუდოთ, რომ ნატიური კოდი გამოიძახებს 'operationCompleted' მეთოდს
      // შედეგით ან შეცდომით, და ჩვენ ვუსმენთ ამ გამოძახილებს.
      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("უცნობი შედეგი ნატიური ოპერაციისგან"));
          }
          // დამუშავების გამორთვა, თუ აღარ არის საჭირო
          platform.setMethodCallHandler(null);
        }
        return true; // ვანიშნებთ, რომ გამოძახება დამუშავებულია
      });

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

    return completer.future; // ვაბრუნებთ Future-ს, რომელიც მოგვიანებით დასრულდება
  }
}
// Widget-ში ან სხვა ადგილას:
// final service = NativeService();
// try {
//   final nativeResult = await service.performNativeOperation();
//   print("ნატიური შედეგი: $nativeResult");
// } catch (e) {
//   print("ნატიური ოპერაციის შეცდომა: $e");
// }