scan method
Future<MiniProgramQrScanResult>
scan(
{ - required String miniProgramId,
- required bool allowTorch,
- 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);
}
}
}