Sobes.tech
Middle

Dartта Completer эмне жана аны Flutter өнүктүрүүдө кантип колдонуу керек?

sobes.tech AI

AIден жооп

Completer — бул dart:async китепканасындагы класс, ал Future түзүүгө жана аны кийинчерээк бир мааниде же катада аяктоого мүмкүндүк берет. Ал асинхрондук операция түздөн-түз Future кайтарбаганда, бирок анын аяктоо жөнүндө кабардар кылууга болот, пайдалуу.

import 'dart:async';

void main() async {
  final completer = Completer<String>(); // Future<String> үчүн Completer түзүү

  // Асинхрондук операцияны имитациялоо
  Future.delayed(Duration(seconds: 2), () {
    // Future ийгиликтүү мааниде аяктоосун камсыздоо
    completer.complete("Операция ийгиликтүү аяктады!");
    // completer.completeError(StateError("Кээ бир нерсе туура эмес болду!")); // же каталар менен
  });

  print("Операциянын аяктоосун күтүп жатабыз...");

  try {
    // Completerден Future алалы жана анын аяктоосун күтөбүз
    final result = await completer.future;
    print("Жыйынтык: $result");
  } catch (e) {
    print("Ката чыкты: $e");
  }
}

Flutterда Completer көбүнесе колдонулат:

  • нативдик APIлер менен интеграциялоо: Нативдик код операциянын аяктоо учурунда callback чакырганда, аны Dartта 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");
// }