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.
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.
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.
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.
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.
// 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
}// Acota de AnyMapViewHolder al holder concreto
if let holder = mapState.getMapViewHolder() as? MapKitViewHolder {
holder.mapView.showsTraffic = true
}// map de la interfaz común es unknown: acótalo al tipo del proveedor antes de usarlo
const holder = mapViewState.getMapViewHolder();
const map = holder?.map as maplibregl.Map | undefined;
map?.addLayer({ id: 'buildings', type: 'fill-extrusion', source: 'composite' });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.
MapServiceRegistry
Defina `MapServiceKey
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.
// 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.