Middle
Kas yra Completer Dart ir kaip jį galima naudoti Flutter kūrime?
sobes.tech AI
Atsakymas iš AI
Completer yra klasė dart:async bibliotekoje, leidžianti sukurti Future ir vėliau jį užbaigti su tam tikra reikšme arba klaida. Ji naudinga, kai asinchroninė operacija tiesiogiai negrąžina Future, bet gali būti pranešta apie jos užbaigimą.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Sukuriame Completer, skirtą Future<String>
// Asinchroninės operacijos imitacija
Future.delayed(Duration(seconds: 2), () {
// Užbaigiame Future sėkminga reikšme
completer.complete("Operacija sėkmingai užbaigta!");
// completer.completeError(StateError("Kažkas nepavyko!")); // arba su klaida
});
print("Laukiame operacijos užbaigimo...");
try {
// Gauname Future iš Completer ir laukiame jo užbaigimo
final result = await completer.future;
print("Rezultatas: $result");
} catch (e) {
print("Įvyko klaida: $e");
}
}
Flutter'e Completer dažnai naudojamas:
- Integracijai su natyviniais API: Kai natyvinis kodas iškviečia atgalinį kvietimą (callback) operacijos pabaigoje, galima naudoti
Completeršiam callback'ui paversti į Future Dart'e. - Sukurti savo asinchronines operacijas: Jei reikia sukurti asinchroninę funkciją, kuri nenaudoja esamų Future grąžinančių API.
- Sąveikai tarp izoliatorių: Signalizacijai apie darbo pabaigą kitoje izoliatoriuje.
Pavyzdys naudojimo Flutter'e su natyviniais API (hipotetinis):
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');
// Tikimasi, kad natyvinis kodas iškvies 'operationCompleted' metodą
// su rezultatu arba klaida, ir mes stebėsime šiuos iškvietimus.
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("Nežinomas natyvios operacijos rezultatas"));
}
// Pašalinti handler'į, jei jis daugiau nereikalingas
platform.setMethodCallHandler(null);
}
return true; // Nurodome, kad iškvietimas apdorotas
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Grąžiname Future, kuris bus užbaigtas vėliau
}
}
// Widget'e arba kitur:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Natyvinis rezultatas: $nativeResult");
// } catch (e) {
// print("Natyvinės operacijos klaida: $e");
// }