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

Flutter中Google Maps自定义Marker图标BitmapDescriptor.asset()不显示

解决Google Maps自定义Marker图标不显示的问题

针对你遇到的自定义Marker图标始终显示默认红钉、BitmapDescriptor的_json字段为空的问题,按以下步骤排查解决:

1. 修正资源路径的大小写匹配

你的代码中使用AppAssets.pinred对应assets/icons/pinRed.png,但Flutter的资源路径严格区分大小写。代码里的pinred(全小写)和实际文件名pinRed.png(R大写)不匹配,导致资源加载失败,BitmapDescriptor无法正确初始化。

直接修正:确保代码中的资源名称和实际文件名完全一致,比如把代码里的AppAssets.pinred改为AppAssets.pinRed,AppAssets.pinblue改为AppAssets.pinBlue,同时确认AppAssets类中的常量定义也对应正确的文件名。

2. 优化图标加载逻辑

当前加载时机虽可行,但调整为更直观的异步加载方式,同时增加错误捕获方便排查:

// 资源声明
late BitmapDescriptor redPin;
late BitmapDescriptor bluePin;

@override
void initState() {
  super.initState();
  _loadMarkerIcons();
}

void _loadMarkerIcons() async {
  try {
    redPin = await BitmapDescriptor.asset(
      const ImageConfiguration(size: Size(55, 55)), 
      AppAssets.pinRed
    );
    bluePin = await BitmapDescriptor.asset(
      const ImageConfiguration(size: Size(55, 55)), 
      AppAssets.pinBlue
    );
    setState(() {});
  } catch (e) {
    print("加载Marker图标失败: $e");
  }
}

3. 清理缓存并验证资源

执行flutter clean后重新运行项目,避免旧缓存干扰。同时确认pubspec.yaml的资源配置正确,且assets/icons/目录下确实存在pinRed.png和pinBlue.png文件。

4. 确保图标初始化完成后再使用

在构建Marker时增加判断,避免使用未初始化的BitmapDescriptor:

GoogleMaps(
  // 其他属性...
  markers: {
    if (redPin != null && bluePin != null)
      Marker(
        icon: isSelected ? bluePin : redPin,
        // 其他Marker属性...
      )
  }
)

按上述步骤处理后,自定义Marker图标应该能正常显示。

内容的提问来源于stack exchange,提问作者zh24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:42:40