开启MapboxMap的myLocationEnabled导致Flutter安卓应用崩溃
Mapbox Flutter 开启myLocationEnabled后崩溃问题求助
运行包含MapboxMap组件的Flutter安卓应用时,应用可正常运行,但一旦开启myLocationEnabled: true就会崩溃,调试控制台输出错误信息。已正确配置Android文件夹中所有定位权限相关文件。
环境信息
- 设备:通过无线ADB连接的Pixel 7 Pro
- 开发环境:Docker中Ubuntu环境的Flutter(容器外也出现相同问题)
- 依赖版本:
mapbox_gl: ^0.16.0permission_handler: ^10.3.0
问题诉求
是否有已知修复方案?还是必须使用geolocator自行收集定位数据?这种方式对地图类应用来说不够优雅。
已尝试AI生成文件、在线教程、Stack Overflow方案等数十种实现,均无效;也试过mapbox_maps_flutter、mapbox-gl-js等其他API,问题依旧。
错误栈
E/Mbgl-MapChangeReceiver(29407): java.lang.IncompatibleClassChangeError: Found interface com.google.android.gms.location.FusedLocationProviderClient, but class was expected (declaration of 'com.google.android.gms.location.FusedLocationProviderClient' appears in /data/app/~~gb-5muDWr4YgcgsimCcKAQ==/com.mvp1.dsco-97NaE_OWQAZrtRkBhF9zRQ==/base.apk) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.android.core.location.GoogleLocationEngineImpl.requestLocationUpdates(GoogleLocationEngineImpl.java:58) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.android.core.location.GoogleLocationEngineImpl.requestLocationUpdates(GoogleLocationEngineImpl.java:26) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.android.core.location.LocationEngineProxy.requestLocationUpdates(LocationEngineProxy.java:34) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.location.LocationComponent.onLocationLayerStart(LocationComponent.java:1439) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.location.LocationComponent.enableLocationComponent(LocationComponent.java:1568) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.location.LocationComponent.setLocationComponentEnabled(LocationComponent.java:551) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxgl.MapboxMapController.enableLocationComponent(MapboxMapController.java:274) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxgl.MapboxMapController.updateMyLocationEnabled(MapboxMapController.java:1563) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxgl.MapboxMapController.access$100(MapboxMapController.java:91) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxgl.MapboxMapController$1.onStyleLoaded(MapboxMapController.java:141) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.maps.MapboxMap.notifyStyleLoaded(MapboxMap.java:963) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.maps.MapboxMap.onFinishLoadingStyle(MapboxMap.java:225) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.maps.MapView$MapCallback.onDidFinishLoadingStyle(MapView.java:1383) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.maps.MapChangeReceiver.onDidFinishLoadingStyle(MapChangeReceiver.java:198) E/Mbgl-MapChangeReceiver(29407): at com.mapbox.mapboxsdk.maps.NativeMapView.onDidFinishLoadingStyle(NativeMapView.java:1166) E/Mbgl-MapChangeReceiver(29407): at android.os.MessageQueue.nativePollOnce(Native Method) E/Mbgl-MapChangeReceiver(29407): at android.os.MessageQueue.next(MessageQueue.java:335) E/Mbgl-MapChangeReceiver(29407): at android.os.Looper.loopOnce(Looper.java:161) E/Mbgl-MapChangeReceiver(29407): at android.os.Looper.loop(Looper.java:288) E/Mbgl-MapChangeReceiver(29407): at android.app.ActivityThread.main(ActivityThread.java:7918) E/Mbgl-MapChangeReceiver(29407): at java.lang.reflect.Method.invoke(Native Method) E/Mbgl-MapChangeReceiver(29407): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/Mbgl-MapChangeReceiver(29407): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
相关代码(map_page.dart)
import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:mapbox_gl/mapbox_gl.dart'; class MapPage extends StatefulWidget { const MapPage({super.key}); @override MapPageState createState() => MapPageState(); } class MapPageState extends State<MapPage> { // Imports the necessary Mapbox data from 'gradle.properties'. static const accessToken = String.fromEnvironment("MAPBOX_ACCESS_TOKEN", defaultValue: ""); static const mapStyle = String.fromEnvironment("MAPBOX_STYLE_URL", defaultValue: "mapbox://styles/mapbox/dark-v11"); late bool _locationRequested; late bool _locationEnabled; MapboxMapController? _mapController; @override void initState() { super.initState(); _locationRequested = false; _locationEnabled = false; _getLocationPermission(); } /// Reloads the page once location has been requested and enabled. Future<void> _getLocationPermission() async { if (!_locationRequested) await Permission.locationWhenInUse.request(); bool locationGranted = await Permission.locationWhenInUse.isGranted; setState(() { _locationRequested = true; _locationEnabled = locationGranted; }); } /// Calls `_buildMap()` if location is enabled; /// shows a loading circle otherwise. @override Widget build(BuildContext context) { Widget content = _locationEnabled ? _buildMap() : const CircularProgressIndicator(); return Center(child: content); } /// Builds and displays the Mapbox map. /// (This can only be called if location is enabled.) Widget _buildMap() { return MapboxMap( // Until the camera starts tracking the user's location, // the map will center on Athens, Greece. initialCameraPosition: const CameraPosition( target: LatLng(37.983810, 23.727539), zoom: 12.0, ), accessToken: accessToken, onMapCreated: _onMapCreated, styleString: mapStyle, myLocationEnabled: true, //! Enabling this crashes the app myLocationTrackingMode: MyLocationTrackingMode.Tracking, ); } void _onMapCreated(MapboxMapController controller) { debugPrint("DEBUG | `_onMapCreated()` called"); // setState(() => _mapController = controller); _mapController = controller; } }
内容的提问来源于stack exchange,提问作者S013
相关产品推荐
相关产品推荐

