Dokumentation / Sonstiges / Native-Erweiterungen

Native-Erweiterungen

MapConductor wrapped nicht alle Funktionen der einzelnen Map-SDKs. Wenn Sie ein Ausdrucksmittel benötigen, das in der einheitlichen API nicht vorhanden ist, gibt es zwei Wege, um nach unten zu gelangen, ohne die Abstraktion aufzugeben. Unabhängig davon, welchen Sie verwenden, funktionieren die anderen Teile dieses Bildschirms weiterhin mit der gemeinsamen API.

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

01 · Ende der Abstraktion

Die einheitliche API behandelt nur Konzepte, die allen Anbietern gemeinsam sind. Dinge wie 3D-Gebäude-Extrusion, Verkehrsebenen bestimmter Anbieter oder benutzerdefinierte Shader sind absichtlich nicht enthalten. Wenn man versuchen würde, alles einzuschließen, würde die gemeinsame API zum kleinsten gemeinsamen Nenner werden und schwer zu verwenden sein.

1 · MapViewHolder

Entität unverändert ausleihen

Rufen Sie die native Karteninstanz ab und rufen Sie direkt die API des SDK auf. Verfügbar auf allen 3 Plattformen.

2 · MapServiceRegistry

Funktion einstecken

Zusätzliche Module registrieren ihre Funktion mit einem typisierten Schlüssel, ohne Core zu ändern. Dies ist der Mechanismus für die SDK-Erweiterung.

Plattform

02 · Native Karte berühren

Wenn Sie getMapViewHolder() aus dem Zustandsobjekt aufrufen, wird ein Halter zurückgegeben, der die Kartenansicht und die Karteninstanz für diesen Anbieter enthält. Wenn Sie den Typ eingrenzen, haben Sie das nackte SDK. Dieser Halter verfügt auch über die gegenseitige Umrechnung von Koordinaten und Bildschirmpixeln.

Mitglieder
Beschreibung
mapView
Ansicht des Anbieters (Container für MKMapView, MapView, maplibregl.Map usw.).
map
Instanz der Karte selbst. Die API des SDK wird von hier aufgerufen.
toScreenOffset(position)
Koordinaten zu Bildschirmpixeln. Neigung und Rotation werden berücksichtigt.
fromScreenOffset(offset)
Bildschirmpixel zu Koordinaten. Es gibt eine asynchrone und eine synchrone Version.
Kotlin
// Nach dem Einengen ist ab hier alles das reine Google Maps SDK
val holder = mapViewState.getMapViewHolder()
if (holder is GoogleMapViewHolder) {
    holder.map.isTrafficEnabled = true
}

Der Halter kann verwendet werden, nachdem die Initialisierung der Karte abgeschlossen ist. Während der Nicht-Initialisierung wird null zurückgegeben. Rufen Sie ihn daher innerhalb von onMapLoaded oder bei einem späteren Vorgang auf.

03 · Modul einstecken

MapServiceRegistry ist die Schnittstelle, über die zusätzliche Module ihre eigenen Funktionen einfügen können, ohne den Core zu ändern. Sie werden mit einem typisierten Schlüssel registriert und von der benötigten Seite mit demselben Schlüssel abgerufen. Da der Schlüssel einen Typ hat, ist kein Casting des abgerufenen Werts erforderlich. Derzeit wird dies vom Marker-Clustering verwendet, das das vom Anbieter registrierte MarkerRenderingSupport abruft und rendert.

Android · React

MapServiceRegistry

Definieren Sie `MapServiceKey` als Singleton, fügen Sie es mit `put` in `MutableMapServiceRegistry` ein, und die Verwendungsseite empfängt es mit `get`. Unter Android verweisen Sie auf das registerbezogene Registrierungsbuch aus `CompositionLocal` (`LocalMapServiceRegistry`).

iOS

MapServiceRegistryScope

Definieren Sie den Schlüssel als einen Typ, der `MapServiceKey` entspricht, und führen Sie `put` in `MutableMapServiceRegistry` aus. Das Registrierungsbuch wird vom Zustandsobjekt (`MapViewState.serviceRegistry`) gehalten, und der Provider macht es während des Zusammenbaus von `content` mit `MapServiceRegistryScope.with(...)` sichtbar. Es ist nicht `Environment` von SwiftUI, weil der Inhalt des Kartenwerts ein Wert namens `MapViewContent` und keine View-Hierarchie ist.

map/MapServiceRegistry · Form des typisierten Schlüssels
// Kotlin: den Schlüssel als Singleton-Object definieren
object MarkerRenderingSupportKey : MapServiceKey<MarkerRenderingSupport<*>>

registry.put(MarkerRenderingSupportKey, support)
val support = registry.get(MarkerRenderingSupportKey) // Es kommt mit erhaltenem Typ zurück

// Swift: den Schlüssel als Typ definieren, der MapServiceKey entspricht
enum MarkerRenderingSupportKey: MapServiceKey {
    typealias Value = any MarkerRenderingSupport
}

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

// TypeScript: den Schlüssel mit createMapServiceKey<T>() erzeugen
const MarkerRenderingSupportKey = createMapServiceKey<MarkerRenderingSupport>();

Die drei hier aufgeführten Methoden bringen alle anbieterspezifischen Code in den Bildschirm. Da dies zu Teilen wird, die nicht mehr funktionieren, wenn der Anbieter ausgetauscht wird, empfiehlt es sich, die verwendeten Stellen innerhalb der Verzweigung zusammenzufassen.

Verwandte Seiten