LeCodesdocs

QRScanner

QR-сканер камеры хоста как Presentable: открой его на весь экран, сделай Router.push или встрой среди детей экрана как узел живого предпросмотра. Опционален по хосту — всегда проверяй через QRScanner.isSupported, прежде чем предлагать эту возможность.

Обзор

TypeScript
if (QRScanner.isSupported) {
  const scanner = QRScanner().onScan(data => {
    if (data === null) return          // кадр камеры без читаемого кода
    console.log('scanned:', data)
    scanner.close()
  })
  await scanner.open()                 // спрашивает разрешение на камеру, затем показывает сканер
}

API

TypeScript
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() (или пока роутер его не вытолкнет). Если открываешь его из флоу экранов, закрывай после успешного скана, иначе камера останется занятой.

Смотрите также