Flutter中google_maps_flutter加载大量位置及缩放时触发空指针异常
可行修复方案
1. 分批加载标记点
避免一次性加载所有位置点,根据地图可视区域动态加载:
- 监听
GoogleMapController的onCameraMove事件,获取当前可视范围 - 仅加载可视范围内的标记点,超出范围的暂时移除
- 示例代码:
GoogleMap( onCameraMove: (CameraPosition position) async { final bounds = await controller.getVisibleRegion(); final visibleMarkers = allMarkers.where((marker) { return bounds.contains(marker.position); }).toList(); setState(() { markers = Set<Marker>.from(visibleMarkers); }); }, markers: markers, // 其他地图配置 )
2. 同步升级相关依赖版本
- 在
pubspec.yaml中使用google_maps_flutter的最新稳定版 - 同步升级Android端Google Maps SDK版本(修改
android/build.gradle):
dependencies { implementation 'com.google.android.gms:play-services-maps:18.2.0' // 替换为最新兼容版本 }
3. 优化自定义Marker资源
- 避免使用过大的自定义图标,优先选择矢量图或压缩后的图片资源
- 检查图标资源路径,确保在所有设备上能正确加载,避免空引用
4. 临时禁用硬件加速
在AndroidManifest.xml中对地图所在Activity禁用硬件加速,缓解GL线程异常:
<activity android:name=".MainActivity" android:hardwareAccelerated="false"> <!-- 其他Activity配置 --> </activity>
5. 使用标记聚合库
当标记点数量极多时,用flutter_map_marker_cluster等库实现标记聚合:
- 将近距离标记点合并为集群,缩放时再展开
- 减少单帧渲染的标记数量,降低GL线程负载
错误日志详情
FATAL EXCEPTION: GLThread 247496
Process: com.jio.jcpapps, PID: 31625
java.lang.NullPointerException: Attempt to get length of null array
at java.nio.ByteBufferAsIntBuffer.put(ByteBufferAsIntBuffer.java:122)
at com.google.maps.api.android.lib6.gmm6.vector.gl.buffer.n.i(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):2)
at com.google.maps.api.android.lib6.gmm6.vector.gl.buffer.n.d(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):3)
at com.google.maps.api.android.lib6.gmm6.vector.gl.drawable.ai.s(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):30)
at com.google.maps.api.android.lib6.gmm6.vector.gl.drawable.ao.s(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):10)
at com.google.maps.api.android.lib6.gmm6.vector.bx.s(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):29)
at com.google.maps.api.android.lib6.gmm6.vector.bq.b(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):157)
at com.google.maps.api.android.lib6.gmm6.vector.at.run(:com.google.android.gms.dynamite_mapsdynamite@232414037@23.24.14 (150400-0):48)
内容的提问来源于stack exchange,提问作者Shirsh Shukla

