gpt4 book ai didi

Flutter:如何使用 Getx Obx 更新标记在谷歌地图中的位置?

转载 作者:行者123 更新时间:2023-12-05 01:54:51 27 4
gpt4 key购买 nike

我有以下 View

import 'dart:async';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import '../../Controllers/mapview_controller.dart';

class MapViewerPage extends StatelessWidget {
MapViewerPage({Key? key}) : super(key: key);

final MapViewController mapcontroller = MapViewController();
final Completer<GoogleMapController> _controller = Completer();
final CameraPosition _initialCameraPosition = const CameraPosition(
target: LatLng(28.527582, 77.0688971),
zoom: 16,
);

final BitmapDescriptor defaultIcon =
BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed);

final List<Marker> allMarkers = [];

@override
Widget build(BuildContext context) {
return GetBuilder<MapViewController>(
init: mapcontroller,
builder: (controller) {
return SizedBox(
width: double.infinity,
height: double.infinity,
child: Obx(() => GoogleMap(
myLocationButtonEnabled: true,
markers:Set<Marker>.of(allMarkers),
mapType: MapType.normal,
initialCameraPosition: _initialCameraPosition,
onMapCreated: (GoogleMapController gmcontroller) {
_controller.complete(gmcontroller);
gmcontroller.setMapStyle(controller.loadMapStyle());
},
)),
),
});
}

getMarkers() {
//get markers from controller
var realdata = mapcontroller.realtimeList;

realdata.asMap().forEach((key, value) {
var _marker = Marker(
consumeTapEvents: true,
markerId: MarkerId(key.toString()),
position: LatLng(
double.parse(value.latitude), double.parse(value.longitude)),
onTap: () {
//do something here
});

allMarkers.add(_marker);
});
}
}

我的 Controller 看起来像这样。

import 'package:flutter/services.dart';
import 'package:get/get.dart';
import '../../Models/model_realtime.dart';
import '../../Providers/common_api_provider.dart';

class MapViewController extends GetxController {
var isLoading = false.obs;
var realtimeList = <ModelRealtime>[].obs;

@override
void onInit() {
fetchRealtimeData();
super.onInit();
}

void fetchRealtimeData() async {
try {
isLoading(true);
var realtime = await CommonApiProvider.realTimeData();
if (realtime != null) {
realtimeList.value = realtime;
}
} catch (e) {
isLoading(false);
// ignore: avoid_print
print(e);
rethrow;
} finally {
isLoading(false);
}
}

loadMapStyle() async {
String style = await rootBundle.loadString("assets/map_style.json");
return style;
}
}

这些代码工作得很好,但似乎每次新数据到达时都会重新加载/刷新 Googlemap。如何在不重新加载/刷新 Googlemap 的情况下,仅在每次更新数据库中的新纬度和经度时更新标记的位置?

谢谢

最佳答案

您正在 View 内初始化 allMarkers 列表,这就是您需要手动刷新页面以便在 map 上显示标记的原因。

MapViewController内初始化allMarkers

List<Marker> allMarkers = <Marker>[].obs; // Inside Map View Controller

然后,在 Google map 小部件中替换标记属性

Obx(() => GoogleMap(
myLocationButtonEnabled: true,
markers:Set<Marker>.of(controller.allMarkers), // <====== Update
mapType: MapType.normal,
initialCameraPosition: _initialCameraPosition,
onMapCreated: (GoogleMapController gmcontroller) {
_controller.complete(gmcontroller);
gmcontroller.setMapStyle(controller.loadMapStyle());
},
))

并且在getMarkers函数中

getMarkers() {
// Add this line. Create map view controller object
final MapViewController _controller = Get.find(); // <======= Add
//get markers from controller
var realdata = mapcontroller.realtimeList;

realdata.asMap().forEach((key, value) {
var _marker = Marker(
consumeTapEvents: true,
markerId: MarkerId(key.toString()),
position: LatLng(
double.parse(value.latitude), double.parse(value.longitude)),
onTap: () {
//do something here
});

_controller.allMarkers.add(_marker); // <===== Update
_controller.update() // <=== Add, because you are using GetBuilder
});
}
}

关于Flutter:如何使用 Getx Obx 更新标记在谷歌地图中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70497191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com