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");
// }