Middle
Kas ir Completer Dart un kā to var izmantot Flutter izstrādē?
sobes.tech AI
Atbilde no AI
Completer ir klases dart:async bibliotēkā, kas ļauj izveidot Future un to vēlāk pabeigt ar kādu vērtību vai kļūdu. Tas ir noderīgi, kad asīnhroniska operācija tieši neatgriež Future, bet par tās pabeigšanu var tikt saņemta informācija.
import 'dart:async';
void main() async {
final completer = Completer<String>(); // Izveidojam Completer priekš Future<String>
// Asīnhroniskas operācijas imitācija
Future.delayed(Duration(seconds: 2), () {
// Pabeidzam Future ar veiksmīgu vērtību
completer.complete("Operācija veiksmīgi pabeigta!");
// completer.completeError(StateError("Kas notika ne tā!")); // vai ar kļūdu
});
print("Gaidām operācijas pabeigšanu...");
try {
// Saņemam Future no Completer un gaidām tā pabeigšanu
final result = await completer.future;
print("Rezultāts: $result");
} catch (e) {
print("Kļūda: $e");
}
}
Flutter Completer bieži tiek izmantots:
- Integrācijai ar nativajiem API: Kad nativais kods izsauc atpakaļ zvanu (callback) operācijas beigās, to var pārvērst par Future Dart valodā, izmantojot
Completer. - Pašu izstrādātu asīnhronisko operāciju realizācijai: Ja nepieciešams izveidot asīnhronisku funkciju, kas neizmanto esošos Future API.
- Saskarsmei starp izolātiem: Signāla nosūtīšanai par darba pabeigšanu citā izolātā.
Piemērs Flutter ar nativā API (hipotētisks):
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');
// Pieņem, ka nativais kods izsauks 'operationCompleted' metodi
// ar rezultātu vai kļūdu, un mēs klausāmies šos izsaukumus.
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("Nezināms rezultāts nativajā operācijā"));
}
// Noņemt handler, ja tas vairs nav nepieciešams
platform.setMethodCallHandler(null);
}
return true; // Norādām, ka izsaukums ir apstrādāts
});
} on PlatformException catch (e) {
completer.completeError(e);
}
return completer.future; // Atgriež Future, kas tiks pabeigts vēlāk
}
}
// Widget vai citur:
// final service = NativeService();
// try {
// final nativeResult = await service.performNativeOperation();
// print("Nativais rezultāts: $nativeResult");
// } catch (e) {
// print("Kļūda nativajā operācijā: $e");
// }