Middle
Mis on Completer Dartis ja kuidas seda saab kasutada Flutter arenduses?
sobes.tech AI
Vastus AI-lt
Completer on klass dart:async raamatukogus, mis võimaldab luua Future ja seda hiljem lõpetada mingi väärtuse või veaga. See on kasulik, kui asünkroonne operatsioon ei tagasta otse Future-d, kuid selle lõpetamisest saab teavitada.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Loome Completer Future<String>-i jaoks
// Asünkroonse operatsiooni simulatsioon
Future.delayed(Duration(seconds: 2), () {
// Lõpetame Future edukalt väärtusega
completer.complete("Operatsioon edukalt lõpetatud!");
// completer.completeError(StateError("Midagi läks valesti!")); // või veaga
});
print("Ootame operatsiooni lõpetamist...");
try {
// Saame Future Completer-ist ja ootame selle lõpetamist
final result = await completer.future;
print("Tulemus: $result");
} catch (e) {
print("Viga: $e");
}
}
Flutteris kasutatakse Completer sageli:
- Integratsiooniks natiivsete API-dega: Kui natiivkood kutsub tagasi (callback) operatsiooni lõpetamisel, saab seda kasutada
Completer-i abil selle Future-ks muutmiseks Dartis. - Kohandatud asünkroonsete operatsioonide realiseerimiseks: Kui on vaja luua asünkroonne funktsioon, mis ei kasuta olemasolevaid Future-teenuseid.
- Suhtluseks isolaatide vahel: Signaali andmiseks teise isolaadi töö lõpetamise kohta.
Näide Flutteris natiivse API-ga (hüpoteetiline):
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');
// Eeldatakse, et natiivkood kutsub välja 'operationCompleted'
// tulemusega või veaga, ja me kuulame neid kutseid.
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("Tundmatu tulemus natiivoperatsioonist"));
}
// Eemalda käsitleja, kui see enam ei ole vajalik
platform.setMethodCallHandler(null);
}
return true; // Märgime, et kutse on töödeldud
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Tagastame Future, mis lõpetatakse hiljem
}
}
// Widgetis või mujal:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Natiivne tulemus: $nativeResult");
// } catch (e) {
// print("Natiivse operatsiooni viga: $e");
// }