ส่วนขยายเนทีฟ
MapConductor ไม่ห่อหุ้มฟีเจอร์ทั้งหมดของ Map SDK แต่ละตัว เมื่อคุณต้องการนิพจน์ที่ไม่มีใน API แบบรวม จะมีสองวิธีในการลงไปข้างล่างโดยไม่ทิ้งการนามธรรม ไม่ว่าคุณจะใช้วิธีใด ส่วนอื่นๆ ของหน้าจอนั้นจะยังทำงานด้วย API ทั่วไปเหมือนเดิม
01 · จุดสิ้นสุดของการนามธรรม
API แบบรวมจัดการเฉพาะแนวคิดที่มีร่วมกันในทุกผู้ให้บริการเท่านั้น สิ่งต่างๆ เช่น การยืดออกของอาคาร 3 มิติ เลเยอร์การจราจรของผู้ให้บริการเฉพาะ หรือเชเดอร์ที่กำหนดเอง ถูกตั้งใจให้ไม่รวมอยู่ด้วย เพราะถ้าพยายามครอบคลุมทุกอย่าง API ทั่วไปจะกลายเป็นตัวหารร่วมน้อยสุดและยากต่อการใช้งาน
ยืมเอนทิตีตามที่เป็น
ดึงอินสแตนซ์แผนที่เนทีฟออกมาและเรียก API ของ SDK นั้นโดยตรง มีอยู่ในทั้ง 3 แพลตฟอร์ม
แทรกฟังก์ชัน
โมดูลเพิ่มเติมลงทะเบียนฟังก์ชันการทำงานของตัวเองด้วยคีย์ที่พิมพ์โดยไม่ต้องแก้ไข Core เป็นกลไกสำหรับฝั่งที่ขยาย SDK
02 · สัมผัสแผนที่เนทีฟ
เมื่อเรียก getMapViewHolder() จากออบเจ็กต์สถานะ จะมีการส่งคืนโฮลเดอร์ที่มีมุมมองแผนที่และอินสแตนซ์แผนที่สำหรับผู้ให้บริการนั้นๆ หากคุณจำกัดประเภท ส่วนที่เหลือก็คือ SDK เปล่าๆ โฮลเดอร์นี้ยังมีการแปลงพิกัดและพิกเซลหน้าจอแบบสองทาง
// เมื่อแคบชนิดลงแล้ว จากตรงนี้ไปคือ Google Maps SDK ล้วน ๆ
val holder = mapViewState.getMapViewHolder()
if (holder is GoogleMapViewHolder) {
holder.map.isTrafficEnabled = true
}// แคบลงจาก AnyMapViewHolder ไปยังโฮลเดอร์ที่เป็นรูปธรรม
if let holder = mapState.getMapViewHolder() as? MapKitViewHolder {
holder.mapView.showsTraffic = true
}// map ของอินเทอร์เฟซร่วมเป็น unknown ให้แคบลงเป็นชนิดของผู้ให้บริการก่อนใช้
const holder = mapViewState.getMapViewHolder();
const map = holder?.map as maplibregl.Map | undefined;
map?.addLayer({ id: 'buildings', type: 'fill-extrusion', source: 'composite' });โฮลเดอร์สามารถใช้งานได้หลังจากการเริ่มต้นแผนที่เสร็จสิ้น ระหว่างที่ยังไม่เริ่มต้นจะมีการส่งคืนค่า null ดังนั้นโปรดเรียกภายใน onMapLoaded หรือในการดำเนินการที่ตามมา
03 · แทรกโมดูล
MapServiceRegistry เป็นจุดเชื่อมต่อสำหรับโมดูลเพิ่มเติมในการแทรกฟีเจอร์ของตัวเองโดยไม่ต้องแก้ไข Core ลงทะเบียนด้วยคีย์ที่มีประเภท และฝั่งที่ต้องการจะดึงออกมาด้วยคีย์เดียวกัน เนื่องจากคีย์มีประเภท จึงไม่ต้องการการแคสต์ค่าที่ดึงออกมา ปัจจุบันสิ่งนี้ถูกใช้โดยการคลัสเตอร์มาร์กเกอร์ ซึ่งดึงและเรนเดอร์ MarkerRenderingSupport ที่ลงทะเบียนโดยผู้ให้บริการ
MapServiceRegistry
กำหนด `MapServiceKey
MapServiceRegistryScope
กำหนดคีย์เป็นประเภทที่สอดคล้องกับ `MapServiceKey` และดำเนินการ `put` ใน `MutableMapServiceRegistry` สมุดรายชื่อถูกถือโดยออบเจ็กต์สถานะ (`MapViewState.serviceRegistry`) และผู้ให้บริการทำให้มองเห็นได้เฉพาะขณะประกอบ `content` ด้วย `MapServiceRegistryScope.with(...)` ไม่ใช่ `Environment` ของ SwiftUI เนื่องจากเนื้อหาของแผนที่เป็นค่าชื่อ `MapViewContent` ไม่ใช่ลำดับชั้นของมุมมอง
// 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>();สามรายการที่กล่าวถึงที่นี่ ล้วนนำรหัสเฉพาะของผู้ให้บริการมายังหน้าจอ เนื่องจากสิ่งนี้จะกลายเป็นส่วนที่จะไม่ทำงานเมื่อเปลี่ยนผู้ให้บริการ จึงแนะนำให้รวบรวมตำแหน่งที่ใช้ไว้ภายในการแตกแขนง