Flutter中GetX集成Google Map自定义标记启动不显示问题求助
解决Google Map自定义标记启动不显示、仅热重载后显示的问题
问题核心原因有两个:
- 标记列表未使用GetX的可观察对象,UI无法感知列表更新
- 标记初始化方法未在应用启动阶段触发执行
步骤1:将普通标记列表改为可观察列表
在控制器中,把普通List<Marker>替换为GetX的可观察列表,让UI能监听列表变化:
// 替换原有的 List<Marker> marker = []; final marker = <Marker>[].obs;
步骤2:确保标记初始化在启动时执行
在控制器的onInit生命周期方法中调用getmarker,保证应用启动时就加载标记:
@override void onInit() { super.onInit(); getmarker(); // 启动阶段初始化标记 }
步骤3:处理异步数据的依赖问题
如果你的latlng_坐标列表是异步获取的(比如从API、本地存储加载),需要等坐标列表加载完成后再调用getmarker,避免循环时列表为空:
// 示例:假设latlng_是可观察列表,监听其加载完成事件 latlng_.listen((updatedList) { if (updatedList.isNotEmpty) { getmarker(); } });
修改后的控制器代码片段
import 'package:get/get.dart'; // 其他必要导入... class MapController extends GetxController { final marker = <Marker>[].obs; final latlng_ = <LatLng>[].obs; // 你的坐标列表 final image = 'assets/custom_marker.png'.obs; // 你的标记图片路径 final controllermap = Completer<GoogleMapController>(); final kGooglePlex = CameraPosition( target: LatLng(37.42796133580664, -122.085749655962), zoom: 14.4746, ).obs; Future<Uint8List> getbytesfromassets(String path, int width) async { ByteData data = await rootBundle.load(path); ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetHeight: width); ui.FrameInfo fi = await codec.getNextFrame(); return (await fi.image.toByteData(format: ui.ImageByteFormat.png))! .buffer .asUint8List(); } // 获取自定义标记 getmarker() async { marker.clear(); // 清空旧标记,避免重复添加 for (var i = 0; i < latlng_.length; i++) { final Uint8List icon = await getbytesfromassets(image.value, 70); marker.add(Marker( markerId: MarkerId(i.toString()), position: latlng_[i], icon: BitmapDescriptor.fromBytes(icon), )); } } @override void onInit() { super.onInit(); getmarker(); // 若latlng_是异步加载,可在此添加监听或等待逻辑 } }
视图代码无需修改
你的视图已经用Obx包裹,当marker可观察列表更新时,GoogleMap会自动刷新标记集合,保持原有代码即可。
额外检查项
- 确认
image.value指向的资源路径正确,且已在pubspec.yaml中声明该资源 - 启动时可在
getmarker中打印latlng_.length,确认坐标列表是否有数据
内容的提问来源于stack exchange,提问作者Maaz Mehdi
相关产品推荐
相关产品推荐

