LeCodesdocs

NativeView

Зарегистрированная хостом платформенная вью — карта, QR-сканер, превью камеры, … Хост регистрирует возможность (registerView("map", factory) в своём коде); когда и с чем её показать — это код приложения. QRScanner и CameraView — типизированные обёртки ровно над этим каналом.

Опциональна для хоста — всегда проверяй NativeView.isSupported(name), прежде чем предлагать фичу.

Обзор

TypeScript
if (NativeView.isSupported('map')) {
  const map = NativeView('map', { zoom: 12 })
    .style({ flexGrow: 1, borderRadius: 12 })
    .on('markerTap', data => toast(data.title))

  screen.append(map)                          // встроена в раскладку…
  await map.call('setCenter', 37.62, 55.75)   // …и управляется по JSON-каналу
}

Destination И элемент

Двойственная природа, как у каждого Presentable:

  • Встроенная: помести её среди детей экрана — она раскладывается своими стилями как любой элемент (ElementStyle + drawable-стили, animateTo/animateFrom, классы, onLayout).
  • Полноэкранная: map.open({ transition }) / map.close() — или Router.push(map); она становится текущим destination с onOpen/onClose/onBackPressed, как экран.

Один экземпляр живёт в одном месте за раз. Пуш уже встроенного экземпляра в полный экран — это промоушен: нативная вью перепривязывается к новому родителю с сохранением состояния (работающая камера продолжает работать). open() бросает исключение на хостах без навигационного канала Presentable.

Канал call/event

TypeScript
const result = await view.call(method, ...args)   // JSON-сериализация в обе стороны; reject при
                                                  // неизвестной вью/методе или без поддержки хоста
view.on(event, data => ...)                       // события, которые эмитит нативная сторона
view.off(event, callback)

params (второй аргумент) уходит в фабрику хоста при создании — используй его для опций момента конструирования; всё, что после, — через call.

Пишем типизированную обёртку

Плагины поставляют типизированный TS-класс над сырым каналом, а не выставляют строки коду приложения — конвенцию смотри в QRScanner/CameraView (src/plugins/): зафиксируй viewName/params, наслои типизированные методы поверх call/on и выстави геттер isSupported.

Для возможностей без визуальной поверхности (GPS, bluetooth, …) используй сервисный канал — тот же протокол без вью; Geolocation — его первый плагин.

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