Я создал приложение с react-native-maps, с несколькими маркерами. Я хочу иметь возможность щелкнуть маркер и получить всплывающее окно с заголовком и описанием маркера. В конечном итоге я собираюсь получить список покупок из базы данных и загрузить его как маркер с адресом.
Я пробовал установить идентификатор на маркер, чтобы получить, но вывод показывает идентификатор как нулевой. Как я могу получить подробную информацию о маркере во всплывающем окне?
import MapView, { AnimatedRegion } from "react-native-maps";
import { StyleSheet, Text, View, Dimensions } from "react-native";
import Geocoder from "react-native-geocoding";
import redMarker from '../assets/images/dot.png'
Geocoder.init("AIzaSyBh4LzOmbFVqu5wc_u_9S4yKT1rhbgHBuw");
class GroceryList{
constructor(address, groceries, title, key){
this.address = address;
this.title = title;
this.groceries = groceries;
this.key = key;
}
}
export default class MapScreen extends Component {
constructor() {
super();
this.state = {
longitude: 60.256771,
latitude: 7.909972,
latitudeDelta: 0.0001,
longitudeDelta: 0.0001,
location: null,
locations: [],
AllLists: [],
title: null,
description: null,
key: null,
selectedMarker: null,
};
this._onMarkerPress = this._onMarkerPress.bind(this);
}
markerClick(e) {
console.log(e);
}
renderMarkers(){
return this.state.locations.map(location => {
return <MapView.Marker
coordinate={{ latitude: location.lat, longitude: location.lng }}
title={this.state.title}
description={this.state.description}
key={location.lat}
image={redMarker}
id={this.state.key}
onPress={this._onMarkerPress}
/>
})
}
componentDidMount = async () => {
navigator.geolocation.getCurrentPosition(
({ coords }) => {
this.setState({
longitude: coords.longitude,
latitude: coords.latitude,
latitudeDelta: 0.005,
longitudeDelta: 0.005,
})
},
(error) => alert('Error: Are location services on?'),
{ enableHighAccuracy: true }
)
liste = []
en = new GroceryList("Eiffel Twer", "Melk", "Min første handleliste", "1"),
liste.push(en)
for(const list of liste){
this.setState(prevState => ({
AllLists: [...prevState.AllLists, list],
}))
}
}
getGeoData() {
for (const list of this.state.AllLists) {
Geocoder.from(list.address)
.then((response) => {
this.setState(prevState => ({
locations: [...prevState.locations, response.results[0].geometry.location]
}))
this.setState({
title: list.title,
description: list.groceries,
key: list.key,
})
})
.catch((error) => console.warn(error));
}
}
componentDidUpdate(prevProps, prevState) {
if (this.state.AllLists !== prevState.AllLists) {
this.getGeoData();
}
}
render() {
return (
<View style={styles.container}>
<MapView
style={styles.mapStyle}
region={{
latitude: this.state.latitude,
longitude: this.state.longitude,
latitudeDelta: this.state.latitudeDelta,
longitudeDelta: this.state.longitudeDelta}}
showsUserLocation={true}
showsMyLocationButton={true}
onMarkerPress={this.markerClick}
>
{this.renderMarkers()}
</MapView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center",
},
mapStyle: {
width: Dimensions.get("window").width,
height: Dimensions.get("window").height,
},
});
Вывод console.log в markerClick:
"_dispatchInstances": FiberNode {
"tag": 5,
"key": null,
"type": "AIRMapMarker",
},
"_dispatchListeners": [Function onPress],
"_targetInst": FiberNode {
"tag": 5,
"key": null,
"type": "AIRMapMarker",
},
"bubbles": undefined,
"cancelable": undefined,
"currentTarget": 225,
"defaultPrevented": undefined,
"dispatchConfig": Object {
"registrationName": "onPress",
},
"eventPhase": undefined,
"isDefaultPrevented": [Function functionThatReturnsFalse],
"isPropagationStopped": [Function functionThatReturnsFalse],
"isTrusted": undefined,
"nativeEvent": Object {
"action": "marker-press",
"coordinate": Object {
"latitude": 58.8289179,
"longitude": 5.7244708,
},
"id": null,
"position": Object {
"x": 567,
"y": 1049,
},
},
"target": undefined,
"timeStamp": 1588789970785,
"type": undefined,
}