scan method

Future<MiniProgramQrScanResult> scan({
  1. required String miniProgramId,
  2. required bool allowTorch,
  3. required Duration timeout,
})

Implementation

Future<MiniProgramQrScanResult> scan({
  required String miniProgramId,
  required bool allowTorch,
  required Duration timeout,
}) async {
  _ensureActive();
  if (_activeByApp.isNotEmpty) {
    throw const MiniProgramQrException(
      errorCode: MiniProgramErrorCodes.qrRequestInProgress,
      message: 'A QR scan request is already in progress.',
    );
  }
  _sequence++;
  final scanId = 'qr_${DateTime.now().microsecondsSinceEpoch}_$_sequence';
  _activeByApp[miniProgramId] = scanId;
  try {
    final result = await provider
        .scan(
          MiniProgramQrScanRequest(
            scanId: scanId,
            miniProgramId: miniProgramId,
            allowTorch: allowTorch,
            timeout: timeout,
          ),
        )
        .timeout(
          timeout + const Duration(seconds: 2),
          onTimeout: () async {
            await _cancelBestEffort(scanId);
            throw const MiniProgramQrException(
              errorCode: MiniProgramErrorCodes.qrTimeout,
              message: 'The QR scan request timed out.',
            );
          },
        );
    result.validate();
    return result;
  } on FormatException catch (error) {
    throw MiniProgramQrException(
      errorCode: MiniProgramErrorCodes.qrInvalidResult,
      message: error.message.toString(),
    );
  } finally {
    if (_activeByApp[miniProgramId] == scanId) {
      _activeByApp.remove(miniProgramId);
    }
  }
}