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.
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.
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.
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.
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.
// Nach dem Einengen ist ab hier alles das reine Google Maps SDK
val holder = mapViewState.getMapViewHolder()
if (holder is GoogleMapViewHolder) {
holder.map.isTrafficEnabled = true
}// Von AnyMapViewHolder auf den konkreten Holder einengen
if let holder = mapState.getMapViewHolder() as? MapKitViewHolder {
holder.mapView.showsTraffic = true
}// map der gemeinsamen Schnittstelle ist unknown — vor der Nutzung auf den Anbietertyp einengen
const holder = mapViewState.getMapViewHolder();
const map = holder?.map as maplibregl.Map | undefined;
map?.addLayer({ id: 'buildings', type: 'fill-extrusion', source: 'composite' });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.
MapServiceRegistry
Definieren Sie `MapServiceKey
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.
// 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.