present static method

Future<Map<String, Stream>> present({
  1. EnrollmentFlowOptions? options,
})

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,
  };
}