QRScanner
QR-сканер камеры хоста как Presentable: открой его на весь экран,
сделай Router.push или встрой среди детей экрана как узел живого предпросмотра. Опционален по
хосту — всегда проверяй через QRScanner.isSupported, прежде чем предлагать эту возможность.
Обзор
if (QRScanner.isSupported) {
const scanner = QRScanner().onScan(data => {
if (data === null) return // кадр камеры без читаемого кода
console.log('scanned:', data)
scanner.close()
})
await scanner.open() // спрашивает разрешение на камеру, затем показывает сканер
}API
QRScanner.isSupported: boolean // статик — умеет ли этот хост вообще сканировать?
QRScanner(): QRScanner // создать вью сканера
scanner.onScan(cb: (data: string | null) => void): this // срабатывает на каждый декодированный кадр
scanner.open(opts?: { transition }): Promise<void> // запросить доступ к камере, показать сканер
scanner.close(): void // закрыть, освободить камеруonScanсрабатывает на каждый кадр, который декодирует сканер;nullозначает кадр без читаемого кода, поэтому жди его повторно, пока пользователь наводит. Один и тот же код может сообщаться не раз — делай дебаунс/close()сам, когда получил нужное.open()следует контракту «подготовить, затем показать» (какARScene): текущий пункт назначения остаётся видимым, пока запрашивается разрешение на камеру; переключение — иtransition, если ты его передал — происходит, когда сканер готов. Промис отклоняется, если в камере отказано, хост не умеет сканировать или пока он готовился, случилась другая навигация.- Сканер — полноценный
NativeViewповерх зарегистрированного хостом вью"qrScanner":Router.push(scanner)работает (жест «назад» его выталкивает), и он встраивается как узел лэйаута — помести его среди детей экрана, размером по своим стилям.isSupported— ровно «зарегистрировал ли этот хост это вью».
Note
в отличие от физики (которая молча делает no-op при отсутствии), open() бросает Error на
хостах без сканера. isSupported — это защита — проверяй её, прежде чем вообще показывать кнопку
«Сканировать». См. гейтинг хоста.
Note
жизненный цикл — сканер держит камеру до close() (или пока роутер его не вытолкнет). Если
открываешь его из флоу экранов, закрывай после успешного скана, иначе камера останется занятой.
Смотрите также
- CameraView — обычный предпросмотр камеры + съёмка фото.
- Экраны и Router — пункты назначения, переходы,
Router.push. - Соглашения — гейтинг хоста —
другие защиты возможностей (
Physics.supported,Physics2D.supported).