移动/游戏
在 Flutter 中集成 Mapbox 地图…
当需要在 Flutter 应用(仅 iOS/Android)中集成 mapbox_maps_flutter、配置访问令牌、初始化地图、添加标注、显示用户位置或加载 GeoJSON 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Flutter 中集成 Mapbox特定
解决思路
- 在 pubspec.yaml 中添加依赖 mapbox_maps_flutter: ^2.0.0,然后运行 flutter pub get。
- 将 iOS 部署目标提升到 14.0:在 Xcode 中打开 ios/Runner.xcworkspace,选择 Runner target → General → 将 Minimum Deployments → iOS 设为 14.0;若存在 ios/Podfile,也将 platform :ios, '14.0' 写入并重新运行 pod install。
- 在 ios/Runner/Info.plist 中添加 NSLocationWhenInUseUsageDescription 用途说明字符串。
- 在 android/app/src/main/AndroidManifest.xml 中添加 ACCESS_FINE_LOCATION 与 ACCESS_COARSE_LOCATION 权限。
- 通过 --dart-define 在构建/运行时传入访问令牌(如 flutter run --dart-define=ACCESS_TOKEN=pk.your_token_here),并在 main() 中、创建任何 MapWidget 之前调用 MapboxOptions.setAccessToken(accessToken);切勿在源码中硬编码令牌,CI 中可用 --dart-define=ACCESS_TOKEN=$MAPBOX_ACCESS_TOKEN。
- 使用 MapWidget 初始化地图,传入 key、cameraOptions(center 为 Point(coordinates: Position(lng, lat))、zoom)和 styleUri(如 MapboxStyles.STANDARD)。
- 通过 MapWidget 的 onMapCreated 回调捕获 MapboxMap 控制器,保存到 state 字段中以供后续操作。
- 使用 mapboxMap.annotations.createPointAnnotationManager() 创建标注管理器(管理器应长期复用,只创建一次),并通过 PointAnnotationOptions 配合 image(从 rootBundle 加载的字节)和 iconSize 构建标注,再用 createMulti(options) 批量添加;资源需在 pubspec.yaml 的 flutter.assets 中注册。
- 使用 manager.tapEvents(onTap: ...) 处理标注点击(addOnPointAnnotationClickListener 已废弃),它返回 Cancelable,需在 dispose 中调用 .cancel();longPressEvents、dragEvents 及其他标注类型(如 CircleAnnotationManager.tapEvents)同样返回 Cancelable。
- 从 GeoJSON 加载标注:用 rootBundle.loadString 读取 assets 中的 .geojson,jsonDecode 后遍历 features,将 geometry.coordinates 转为 Position 构建 PointAnnotationOptions,再通过 createMulti 添加;若要素有数千个,改用样式图层(GeoJsonSource + SymbolLayer)而非标注。
- 显示用户位置:在权限已授予后,调用 mapboxMap.location.updateSettings(LocationComponentSettings(enabled: true, puckBearingEnabled: true, locationPuck: LocationPuck(locationPuck2D: DefaultLocationPuck2D())))。
- 相机控制:用 mapboxMap.setCamera(CameraOptions(...)) 瞬时跳转;用 mapboxMap.flyTo(CameraOptions(...), MapAnimationOptions(duration: 2000)) 做动画飞行。
- 排查 iOS 构建失败:若报 “platform is lower than deployment target”,按上述步骤将 Runner target 的 Minimum Deployments → iOS 设为 14.0,并在 Podfile 中设置 platform :ios, '14.0' 后重新 pod install。
- 若地图显示空白网格,检查是否在创建 MapWidget 前调用了 MapboxOptions.setAccessToken。
- 若标注点击不触发,确认使用 manager.tapEvents(onTap: ...) 而非已废弃的 addOnPointAnnotationClickListener,并确认已通过 onMapCreated 捕获 MapboxMap 控制器后再创建标注管理器。
- 修改权限(manifest/Info.plist)后需完全重启应用,热重载不会重新读取这些文件。
适用边界 · 注意事项
- Web 和桌面平台不受支持——该 Flutter SDK 仅面向 iOS 和 Android。
- 需要付费或特定云厂商账号的场景不适用(本技能仅需免费 Mapbox 账号)。