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), () {
    // Ուղղակի ավարտում ենք Future-ը հաջող արժեքով
    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՝ դրա վերածելու համար Future-ի:
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("Անհայտ արդյունք նատիվ գործողությունից"));
          }
          // Հեռացնել handler-ը, եթե այլևս անհրաժեշտ չէ
          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");
// }