Líftími og atburðir MapView
Kort er sýn ásamt stöðuhlut. Staðan (mapViewState) er handfangið þitt á myndavélinni, hönnuninni og hverri aðgerð; sýnin fer einfaldlega inn í viðmótstré vettvangsins. Frumstillingin gengur gegnum sömu stig alls staðar, og hleðslulok og aðgerðir notanda berast sem atburðir.
01 · mapViewState
mapViewState er stöðuhluturinn fyrir eitt kort. Útfærslur eru ólíkar eftir þjónustuaðilum, en meðlimirnir sem birtast eru þeir sömu, svo kóðinn þinn sér aldrei annað en sameiginlega viðmótið.
Staðan lifir sýnina. Þegar sýnin er endurbyggð haldast staða myndavélar og hönnun á stöðunni, svo kortið kemur til baka eins og það var.
// Búðu stöðuna til með remember*, svo sama kortið lifi af snúning
val mapViewState =
rememberGoogleMapViewState(
mapDesign = GoogleMapDesign.Normal,
cameraPosition = initCameraPosition,
)
GoogleMapView(state = mapViewState, modifier = Modifier.fillMaxSize())// ObservableObject: haltu því á sýninni með @StateObject
@StateObject private var mapLibreState = MapLibreViewState(
mapDesignType: MapLibreDesign.OsmBright,
cameraPosition: viewModel.initCameraPosition
)
MapLibreMapView(state: mapLibreState) { MapViewContent() }const [mapViewState, setMapViewState] =
useState<MapViewStateInterface<MapDesignTypeInterface<unknown>> | null>(null);
// MapViewContainer er umbúðin sem skiptir um þjónustuaðila í sýnisforritinu — hún er ekki hluti af SDK-inu
<MapViewContainer initialCamera={INIT_CAMERA} onStateReady={setMapViewState}>
<Markers states={markerStates} />
</MapViewContainer>02 · Líftími frumstillingar
Hver þjónustuaðili gengur gegnum sömu stigin: hlaða SDK-inu, búa til sýnina, búa til kortatilvikið, ljúka við að teikna flísar. Þar sem stigin eru ein sameiginleg InitState þarftu ekki að leggja á minnið reglur hvers þjónustuaðila um hvenær óhætt er að snerta kortið.
Hreyfingar myndavélar og skráning yfirlaga eru samþykktar frá MapCreated og áfram og settar í biðröð innanhúss. Til að bíða eftir fullteiknuðu korti, notaðu onMapLoaded.
Hlaða korta-SDK-inu — skriftumerki á vefnum, frumstilling vettvangs á farsíma. Misheppnist það færist ferlið í Failed.
Vefja innbyggða kortatilvikið í haldara; gerðir sem eru sértækar fyrir SDK-ið haldast á bak við hann.
Vefja haldarann í stýringu sem birtir sameiginlega API-ið og tengir atburði, og festa hana svo við stöðuna.
Að lifa af snúning og endurbyggingu
Á Android er staðan geymd með rememberSaveable, svo myndavél og hönnun endurheimtast eftir snúning eða stillingabreytingu; kortasýnin sjálf er endurnýtt fremur en eytt.
Þegar því er eytt
Við raunverulegt niðurrif losar stýringin yfirlagsstýringar sínar, flísaþjónsleiðir og samferlissvið í einu lagi. Skipti um þjónustuaðila hreinsa fyrra kortið eftir sömu leið.
var ready by remember { mutableStateOf(false) }
MapLibreMapView(
state = mapViewState,
// Called once, when the tiles have finished drawing
onMapLoaded = { state ->
ready = true
state.fitBounds(routeBounds, padding = 48)
},
) {
// Declarations here are not lost before MapCreated — they are queued internally
Marker(markerState)
}
if (!ready) {
// Your own loading overlay, if you want one. The map does not need blocking
Box(Modifier.fillMaxSize()) { CircularProgressIndicator() }
}03 · Atburðir
Stjórarnir sem þú réttir sýninni eru eins á öllum þremur vettvöngunum, og gerðir þeirra sömuleiðis: hleðslulok afhenda þér stöðuhlutinn, snertingar hnit, myndavélarbreytingar stöðu myndavélar.
GoogleMapView(
state = mapViewState,
onMapLoaded = { state -> viewModel.onMapLoaded(state) },
onMapClick = { point -> viewModel.onMapClick(point) },
onCameraMove = { camera -> viewModel.onCameraChanged(camera) },
onCameraMoveEnd = { camera -> viewModel.onCameraSettled(camera) },
) { /* markers, overlays */ }MapLibreMapView(
state: mapLibreState,
onMapLoaded: { state in viewModel.onMapLoaded(state) },
onCameraMoveStart: viewModel.onMapCameraMoveStart,
onCameraMove: viewModel.onCameraChanged,
onCameraMoveEnd: viewModel.onMapCameraMoveEnd
) {
MapViewContent()
}<MapViewContainer
initialCamera={INIT_CAMERA}
onMapClick={() => setSelected(null)}
onCameraMove={setCameraPosition}
>
<Markers states={markerStates} />
</MapViewContainer>Myndavélaratburðir uppfæra líka cameraPosition á stöðunni, svo nýjasta myndavélin er læsileg jafnvel án stjóra. Til að forðast endursókn í miðju handbragði, notaðu aðeins onCameraMoveEnd.
04 · Leið niður í innbyggða lagið
Þegar sameiginlega API-ið dugar ekki er til leið niður í innbyggða kortatilvikið. Þú þarft hana sjaldan — hún er til fyrir þennan eina eiginleika sem er sértækur fyrir þjónustuaðilann.
Haldari utan um innbyggða kortið
Haldarinn ber sýn vettvangsins og kortatilvikið. Kóði sem er sértækur fyrir SDK-ið helst á bak við hann og lekur aldrei inn í sameiginlegan kóða.
Umreikningur hnita og skjápunkta
Umreiknaðu milli landfræðilegra hnita og skjápixla — nauðsynlegt þegar þú leggur þitt eigið viðmót yfir kortið.
// Taktu það aðeins út þegar þú þarft innbyggða API-ið í alvöru val holder = mapViewState.getMapViewHolder() val nativeMap = holder?.map // GoogleMap / MapLibreMap / ... val offset = holder?.toScreenOffset(point)
if let holder = mapViewState.getMapViewHolder() {
let nativeMap = holder.map
let offset = holder.toScreenOffset(position: point)
}const holder = mapViewState.getMapViewHolder(); const nativeMap = holder?.map; // google.maps.Map / maplibregl.Map / ...
Kóði sem notar haldarann er bundinn þjónustuaðilanum. Haltu skýrri línu milli þess sem á að vera sameiginlegt og þess þar sem þú notar innbyggt API af ásetningi.