Карта флаттера в конце смены позиции
Я использую flutter_map, чтобы добавить карту в свой проект. Я могу работать с ним и использовать его возможности. Но мне нужно то, чего я не нашел во flutter_map.
Я хочу прослушать изменение позиции и получить последнюю позицию, когда пользователь перестанет касаться экрана. Как onTapUp или onLongPressUp в виджете GestureDetector.
В flutter_map есть опция onPositionChanged, но она вызывается каждый раз при изменении позиции, а это много. Как только пользователь коснулся экрана, вызывается onPositionChanged, пока пользователь не перестанет касаться экрана. Я могу получить последнюю позицию из этого, но я хочу вызвать API, когда позиция изменится, чтобы получить список ближайших автомобилей. Вызов API каждый раз, когда вызывается onPositionChanged, не подходит.
Поэтому я хочу иметь возможность вызывать API, когда пользователь завершает изменение местоположения (когда он / она перестает касаться экрана).
Вот мой код flutter_map:
FlutterMap(
key: Key('map'),
mapController: main.mapController,
options: MapOptions(
center: LatLng(main.lat, main.long),
zoom: 14,
maxZoom: 18,
minZoom: 10,
onPositionChanged: (mapPosition, boolValue){
_lastposition = mapPosition.center;
}),
layers: [
TileLayerOptions(
errorImage: AssetImage('images/login_icon.png'),
urlTemplate:
"https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",
// subdomains: ['a', 'b', 'c'],
// subdomains: ['', '1', '2', '3', '4']
),
MarkerLayerOptions(
markers: main.markersStart +
main.markersDestination +
main.driverMarkers,
),
],
),
Любая помощь будет оценена, спасибо:).
3 ответа
Лучшее решение, которое я нашел, - добавить слушателя на
MapEventStream
(проверьте события здесь: map_events.dart)
MapController mapController;
StreamSubscription subscription;
@override
void initState() {
mapController = MapController();
mapController.onReady.then((_) {
subscription = mapController.mapEventStream.listen((MapEvent mapEvent) {
if (mapEvent is MapEventMoveStart) {
print(DateTime.now().toString() + ' [MapEventMoveStart] START');
// do something
}
if (mapEvent is MapEventMoveEnd) {
print(DateTime.now().toString() + ' [MapEventMoveStart] END');
// do something
}
});
});
super.initState();
}
@override
void dispose() {
subscription.cancel();
super.dispose();
}
Большое спасибо за этот пост, который мне помогает
Самый простой способ, я думаю, это определитьTimer
вот так:
Timer? timer;
....
А потом внутриonPositionChanged
событие, сначала сбросьте его (фактически сбрасывая старый таймер), затем установите его снова. Используя это,print
вызывается только один раз и через 1 секунду после окончания смены позиции
FlutterMap(
...
options: MapOptions(
onPositionChanged: (MapPosition position, bool hasGesture) {
timer?.cancel();
timer = Timer(Duration(milliseconds: 1000), () {
print(position);
});
}
),
...
)
Вы можете использовать таймер, который запускается только после задержки в одну секунду.
onPositionChanged: (mapPosition, boolValue) {
Timer(Duration(seconds: 1), () {}}