У меня есть карта, на которой мне нужно добавить перетаскиваемый маркер, чтобы пользователь мог выбрать точку.
Если я выберу обычный метод
<MapView
initialRegion={{
....
}}>
<Marker coordinate={this.state.coordinates} draggable />
</MapView
Это не очень плавная обратная связь для пользователя, так как маркер должен быть сначала нажат на долгое время, прежде чем его можно перетаскивать, а также он не может быть перетащен за пределы текущих границ карты, т.е. пользователю необходимо вручную прокрутить карту в другой регион, прежде возможность разместить маркер там.
Так что я нашел обходной путь, следуя этой концепции: https://alizahid.dev/blog/keep-marker-in-center-and-move-map-around-it
<MapView
initialRegion={{
latitudeDelta: 0.02,
longitudeDelta: 0.02,
latitude: this.state.coordinates.latitude,
longitude: this.state.coordinates.longitude
}}
onRegionChange={(result) => this.setState({coordinates: result})}
style={{height: 300}}
>
<Marker coordinate={this.state.coordinates} />
</MapView>
Это работает почти идеально, за исключением факта Я использую отдельную функцию, используя сервис геолокации, чтобы получить текущее местоположение пользователя и поместить туда маркер
componentDidMount() {
Geolocation.getCurrentPosition((position) => {
this.setState({
coordinates: {
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
});
},
(error) => {
console.log(error);
alert("Couldn't get GPS location. Please try again or choose pickup point manually.");
},
{ enableHighAccuracy: true, maximumAge: 10000, timeout: 10000, showLocationDialog: true, forceRequestLocation: true})
}
Когда эта функция возвращает местоположение, маркер перемещается в правильную точку, НО, карта не прокручивает область, в которой находится маркер, так как initialRegion
не меняет область после монтирования.
Если я использую region
вместо o f initialRegion
, карта вообще не прокручивается, так как обратный вызов onRegionChange
постоянно меняет состояние и, вероятно, конфликтует с region
prop.
Что может быть лучшим обходным решением для всех проблем