เอกสารประกอบ / อื่นๆ / ส่วนขยายเนทีฟ

ส่วนขยายเนทีฟ

MapConductor ไม่ห่อหุ้มฟีเจอร์ทั้งหมดของ Map SDK แต่ละตัว เมื่อคุณต้องการนิพจน์ที่ไม่มีใน API แบบรวม จะมีสองวิธีในการลงไปข้างล่างโดยไม่ทิ้งการนามธรรม ไม่ว่าคุณจะใช้วิธีใด ส่วนอื่นๆ ของหน้าจอนั้นจะยังทำงานด้วย API ทั่วไปเหมือนเดิม

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

01 · จุดสิ้นสุดของการนามธรรม

API แบบรวมจัดการเฉพาะแนวคิดที่มีร่วมกันในทุกผู้ให้บริการเท่านั้น สิ่งต่างๆ เช่น การยืดออกของอาคาร 3 มิติ เลเยอร์การจราจรของผู้ให้บริการเฉพาะ หรือเชเดอร์ที่กำหนดเอง ถูกตั้งใจให้ไม่รวมอยู่ด้วย เพราะถ้าพยายามครอบคลุมทุกอย่าง API ทั่วไปจะกลายเป็นตัวหารร่วมน้อยสุดและยากต่อการใช้งาน

1 · MapViewHolder

ยืมเอนทิตีตามที่เป็น

ดึงอินสแตนซ์แผนที่เนทีฟออกมาและเรียก API ของ SDK นั้นโดยตรง มีอยู่ในทั้ง 3 แพลตฟอร์ม

2 · MapServiceRegistry

แทรกฟังก์ชัน

โมดูลเพิ่มเติมลงทะเบียนฟังก์ชันการทำงานของตัวเองด้วยคีย์ที่พิมพ์โดยไม่ต้องแก้ไข Core เป็นกลไกสำหรับฝั่งที่ขยาย SDK

แพลตฟอร์ม

02 · สัมผัสแผนที่เนทีฟ

เมื่อเรียก getMapViewHolder() จากออบเจ็กต์สถานะ จะมีการส่งคืนโฮลเดอร์ที่มีมุมมองแผนที่และอินสแตนซ์แผนที่สำหรับผู้ให้บริการนั้นๆ หากคุณจำกัดประเภท ส่วนที่เหลือก็คือ SDK เปล่าๆ โฮลเดอร์นี้ยังมีการแปลงพิกัดและพิกเซลหน้าจอแบบสองทาง

สมาชิก
คำอธิบาย
mapView
มุมมองของผู้ให้บริการ (คอนเทนเนอร์สำหรับ MKMapView, MapView, maplibregl.Map ฯลฯ)
map
อินสแตนซ์ของแผนที่เอง เรียก API ของ SDK ได้จากที่นี่
toScreenOffset(position)
พิกัดเป็นพิกเซลหน้าจอ การเอียงและการหมุนจะถูกสะท้อน
fromScreenOffset(offset)
พิกเซลหน้าจอเป็นพิกัด มีทั้งแบบแอสิงโครนัสและแบบซิงโครนัส
Kotlin
// เมื่อแคบชนิดลงแล้ว จากตรงนี้ไปคือ Google Maps SDK ล้วน ๆ
val holder = mapViewState.getMapViewHolder()
if (holder is GoogleMapViewHolder) {
    holder.map.isTrafficEnabled = true
}

โฮลเดอร์สามารถใช้งานได้หลังจากการเริ่มต้นแผนที่เสร็จสิ้น ระหว่างที่ยังไม่เริ่มต้นจะมีการส่งคืนค่า null ดังนั้นโปรดเรียกภายใน onMapLoaded หรือในการดำเนินการที่ตามมา

03 · แทรกโมดูล

MapServiceRegistry เป็นจุดเชื่อมต่อสำหรับโมดูลเพิ่มเติมในการแทรกฟีเจอร์ของตัวเองโดยไม่ต้องแก้ไข Core ลงทะเบียนด้วยคีย์ที่มีประเภท และฝั่งที่ต้องการจะดึงออกมาด้วยคีย์เดียวกัน เนื่องจากคีย์มีประเภท จึงไม่ต้องการการแคสต์ค่าที่ดึงออกมา ปัจจุบันสิ่งนี้ถูกใช้โดยการคลัสเตอร์มาร์กเกอร์ ซึ่งดึงและเรนเดอร์ MarkerRenderingSupport ที่ลงทะเบียนโดยผู้ให้บริการ

Android · React

MapServiceRegistry

กำหนด `MapServiceKey` เป็นซิงเกิลตัน, ใส่ลงใน `MutableMapServiceRegistry` ด้วย `put`, และฝั่งผู้ใช้รับค่าด้วย `get` บน Android จะอ้างอิงสมุดรายชื่อของขอบเขตแผนที่จาก `CompositionLocal` (`LocalMapServiceRegistry`)

iOS

MapServiceRegistryScope

กำหนดคีย์เป็นประเภทที่สอดคล้องกับ `MapServiceKey` และดำเนินการ `put` ใน `MutableMapServiceRegistry` สมุดรายชื่อถูกถือโดยออบเจ็กต์สถานะ (`MapViewState.serviceRegistry`) และผู้ให้บริการทำให้มองเห็นได้เฉพาะขณะประกอบ `content` ด้วย `MapServiceRegistryScope.with(...)` ไม่ใช่ `Environment` ของ SwiftUI เนื่องจากเนื้อหาของแผนที่เป็นค่าชื่อ `MapViewContent` ไม่ใช่ลำดับชั้นของมุมมอง

map/MapServiceRegistry · รูปแบบคีย์ที่มีประเภท
// Kotlin: นิยามคีย์เป็น object แบบซิงเกิลตัน
object MarkerRenderingSupportKey : MapServiceKey<MarkerRenderingSupport<*>>

registry.put(MarkerRenderingSupportKey, support)
val support = registry.get(MarkerRenderingSupportKey) // คืนค่ากลับมาพร้อมชนิดเดิม

// Swift: นิยามคีย์เป็นชนิดที่สอดคล้องกับ MapServiceKey
enum MarkerRenderingSupportKey: MapServiceKey {
    typealias Value = any MarkerRenderingSupport
}

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

// TypeScript: สร้างคีย์ด้วย createMapServiceKey<T>()
const MarkerRenderingSupportKey = createMapServiceKey<MarkerRenderingSupport>();

สามรายการที่กล่าวถึงที่นี่ ล้วนนำรหัสเฉพาะของผู้ให้บริการมายังหน้าจอ เนื่องจากสิ่งนี้จะกลายเป็นส่วนที่จะไม่ทำงานเมื่อเปลี่ยนผู้ให้บริการ จึงแนะนำให้รวบรวมตำแหน่งที่ใช้ไว้ภายในการแตกแขนง

หน้าที่เกี่ยวข้อง