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
相关产品推荐
相关产品推荐

