#javascript #android #react-native #react-native-maps
#javascript #Android #react-native #react-native-карты
Вопрос:
Я хочу создать приложение, похожее на Uber. Дело в том, что в документации react-native-maps указано только, как отображать напрямую
В моем случае я хочу, <Marker/>
чтобы они отображались после onPress() (нажатия кнопки) Как этого добиться?
Я попытался изменить состояние, которое использовал <Marker/>
компонент внутри <MapView>
, но, похоже, оно не отображается повторно
Конструктор:
constructor(props) {
super(props)
this.state = {
updatesEnabled: false,
location: {},
modalCategoryVisible: false,
markers: []
}
}
Дескриптор onPress:
_searchStreetVendors = () => {
this.setState({
markers: [
{
merchant_name: "Zaky",
merchant_type: "Sate",
merchant_info: "Selling Sate that is tasty",
merchant_phone: "0812909281234",
location: {
latitude: -6.667772,
longitude: 106.723630,
}
},
]
})
}
Просмотр карты:
render() {
return (
<View style={styles.container}>
<MapView
style={styles.map}
provider={PROVIDER_GOOGLE}
ref={(mapView) => { _mapView = mapView; }}
initialRegion={{
latitude: -6.174969,
longitude: 106.827202,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
}}>
{this.state.markers.map(marker => (
<MapViewMarker
coordinate={marker.location}
title={marker.title}
description={marker.description}
/>
))}
</MapView>
...
<View/>
}
Комментарии:
1. Что вы имеете в виду, когда говорите, что он не отображается повторно? Он будет отображаться только один раз, потому что
state.markers
в нем есть только одно значение.2. @Dan я думал, что это должно быть повторно отображено, если состояние было изменено?
3. Ваш маркер никогда не изменится, потому что вы устанавливаете
state.markers
одно и то же значение при каждом вызове_searchStreetVendors
. Вы правы, при изменении состояния это вызывает повторный рендеринг.
Ответ №1:
Два небольших изменения в вашем коде, и это маркер рендеринга для меня
_searchStreetVendors = () => {
this.setState({
markers: [
{
merchant_name: "Zaky",
merchant_type: "Sate",
merchant_info: "Selling Sate that is tasty",
merchant_phone: "0812909281234",
key: 1,
location: {
latitude: -6.174969,
longitude: 106.827202,
}
},
]
})
}
<MapView
style={styles.map}
provider={PROVIDER_GOOGLE}
ref={(mapView) => { _mapView = mapView; }}
initialRegion={{
latitude: -6.174969,
longitude: 106.827202,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
}}>
{this.state.markers.map(marker => (
<MapView.Marker
coordinate={marker.location}
title={marker.title}
description={marker.description}
key={marker.key}
/>
))}
</MapView>
1) Добавлен ключ, который необходим при отображении множественного маркера на экране, который был показан как предупреждение
2) Просмотр карты.Создатель, я обнаружил, что между текстом не было точки, которая выдавала мне ошибку
Также изменено местоположение маркера, такое же, как initialRegion, просто чтобы проверить, отображается маркер или нет, поэтому проверьте один раз и дайте мне знать, если вы все еще получаете какую-либо ошибку
Ответ №2:
Можете ли вы попробовать следующее?
И изменять параметры в функциях карты, вы используете ключи, которых нет в словаре местоположений. (marker.title и marker.description отсутствуют в словаре )
renderMarkers() {
return this.state.markers.map((marker) => {
return (
<MapViewMarker
coordinate={marker.location}
title={marker.merchant_name}
description={marker. merchant_info}
/>
)
})
}
render() {
return (
<View style={styles.container}>
<MapView
style={styles.map}
provider={PROVIDER_GOOGLE}
ref={(mapView) => { _mapView = mapView; }}
initialRegion={{
latitude: -6.174969,
longitude: 106.827202,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
}}>
{this.state.markers.length > 0 ? this.renderMarkers() : null}
</MapView>
...
<View/>
}