You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:20:44