present static method
Present the enrollment flow
Returns a map with three streams:
- 'results': Stream of EnrollmentResult (final outcome)
- 'progress': Stream of EnrollmentProgress (optional progress updates)
- 'errors': Stream of error messages (String)
The enrollment flow is typically single-shot:
- Streams will emit the final result and close automatically
- Progress stream may emit multiple updates during enrollment
Example:
final streams = await EnrollmentFlow.present(
options: EnrollmentFlowOptions(
cameraPosition: SmartfaceCameraPosition.front,
),
);
streams['results']?.listen((result) {
print('Enrollment: ${result.success ? "SUCCESS" : "FAILED"}');
if (result.success) {
print('User: ${result.customId}');
if (result.descriptor != null) {
print('Descriptor: ${result.descriptor}');
}
}
});
streams['progress']?.listen((progress) {
print('Phase: ${progress.phase}, ${progress.percentage}%');
});
streams['errors']?.listen((error) {
print('Error: $error');
});
Implementation
static Future<Map<String, Stream>> present({
EnrollmentFlowOptions? options,
}) async {
HostedFlowBase.ensureListenerRegistered();
// Clean up any existing enrollment streams
HostedFlowBase.closeEnrollmentStreams();
// Create new stream controllers
HostedFlowBase.enrollResultStreamController =
StreamController<EnrollmentResult>.broadcast();
HostedFlowBase.enrollProgressStreamController =
StreamController<EnrollmentProgress>.broadcast();
HostedFlowBase.enrollErrorStreamController =
StreamController<String>.broadcast();
final opts = options ?? const EnrollmentFlowOptions();
try {
log('π Starting enrollment flow...');
final result = await HostedFlowBase.hostedFlowChannel.invokeMethod(
'HostedFlow.present',
opts.toMap(),
);
final success = result['success'] as bool? ?? false;
if (!success) {
final message = result['message'] as String? ?? 'Unknown error';
log('β Failed to present enrollment flow: $message');
HostedFlowBase.enrollErrorStreamController?.add(message);
HostedFlowBase.closeEnrollmentStreams();
} else {
log('β
Enrollment flow presentation initiated');
}
} catch (e) {
log('β Error presenting enrollment flow: $e');
HostedFlowBase.enrollErrorStreamController?.add(e.toString());
HostedFlowBase.closeEnrollmentStreams();
}
return {
'results': HostedFlowBase.enrollResultStreamController!.stream,
'progress': HostedFlowBase.enrollProgressStreamController!.stream,
'errors': HostedFlowBase.enrollErrorStreamController!.stream,
};
}