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