Documentación / Otros / Extensiones nativas

Extensiones nativas

MapConductor no envuelve todas las funciones de cada SDK de mapas. Cuando necesite una representación que no esté en la API unificada, hay dos formas de bajar sin abandonar la abstracción. Independientemente de la que use, las otras partes de esa pantalla seguirán funcionando con la API común.

1 · HOLDER
Android · iOS · React
2 · REGISTRY
Android · iOS · React

01 · Fin de la abstracción

La API unificada solo maneja conceptos que son comunes a todos los proveedores. Cosas como la extrusión de edificios en 3D, capas de tráfico de proveedores específicos o sombreadores personalizados están excluidas intencionalmente. Si intentáramos cubrir todo, la API común se convertiría en el mínimo común denominador y sería difícil de usar.

1 · MapViewHolder

Tomar prestada la entidad tal cual

Extraiga la instancia del mapa nativo y llame directamente a la API de ese SDK. Disponible en las 3 plataformas.

2 · MapServiceRegistry

Insertar función

Los módulos adicionales registran su propia funcionalidad con una clave con tipo sin modificar Core. Es un mecanismo para quienes extienden el SDK.

Plataforma

02 · Tocar el mapa nativo

Al llamar a getMapViewHolder() desde el objeto de estado, se devuelve un titular que contiene la vista de mapa y la instancia de mapa de ese proveedor. Si restringe el tipo, es el SDK puro. Este titular también tiene la conversión mutua entre coordenadas y píxeles de pantalla.

Miembros
Descripción
mapView
Vista del proveedor (contenedor para MKMapView, MapView, maplibregl.Map, etc.).
map
Instancia del mapa en sí. La API del SDK se llama desde aquí.
toScreenOffset(position)
Coordenadas a píxeles de pantalla. Se reflejan la inclinación y la rotación.
fromScreenOffset(offset)
Píxeles de pantalla a coordenadas. Hay una versión asíncrona y una síncrona.
Kotlin
// Una vez acotado, de aquí en adelante es el Google Maps SDK puro
val holder = mapViewState.getMapViewHolder()
if (holder is GoogleMapViewHolder) {
    holder.map.isTrafficEnabled = true
}

El titular se puede usar después de que se complete la inicialización del mapa. Durante la no inicialización, se devuelve null, así que llámelo dentro de onMapLoaded o en una operación posterior.

03 · Insertar módulo

MapServiceRegistry es el punto de entrada para que módulos adicionales inserten sus propias funciones sin modificar el Core. Se registran con una clave tipificada y el lado necesario la recupera con la misma clave. Dado que la clave tiene un tipo, no es necesario convertir el valor recuperado. Actualmente, esto lo usa la agrupación de marcadores, que recupera y renderiza el MarkerRenderingSupport registrado por el proveedor.

Android · React

MapServiceRegistry

Defina `MapServiceKey` como singleton, haga put en `MutableMapServiceRegistry` y el lado consumidor recibe con get. En Android, se hace referencia al registro del ámbito del mapa desde `CompositionLocal` (`LocalMapServiceRegistry`).

iOS

MapServiceRegistryScope

La clave se define como un tipo que cumple con `MapServiceKey` y se hace put en `MutableMapServiceRegistry`. El registro lo tiene un objeto de estado (`MapViewState.serviceRegistry`) y el proveedor lo hace visible solo mientras construye el contenido con `MapServiceRegistryScope.with(...)`. No es el `Environment` de SwiftUI porque el contenido del mapa es un valor llamado `MapViewContent`, no una jerarquía de vistas.

map/MapServiceRegistry · Forma de clave tipificada
// Kotlin: define la clave como un object singleton
object MarkerRenderingSupportKey : MapServiceKey<MarkerRenderingSupport<*>>

registry.put(MarkerRenderingSupportKey, support)
val support = registry.get(MarkerRenderingSupportKey) // Vuelve con su tipo intacto

// Swift: define la clave como un tipo que cumple MapServiceKey
enum MarkerRenderingSupportKey: MapServiceKey {
    typealias Value = any MarkerRenderingSupport
}

registry.put(MarkerRenderingSupportKey.self, support)
let support = registry.get(MarkerRenderingSupportKey.self)

// TypeScript: crea la clave con createMapServiceKey<T>()
const MarkerRenderingSupportKey = createMapServiceKey<MarkerRenderingSupport>();

Los tres mencionados aquí traen código específico del proveedor a la pantalla. Como esto se convierte en partes que dejarán de funcionar cuando se cambie el proveedor, se recomienda reunir los lugares donde se usan dentro de la ramificación.

Páginas relacionadas