Flutter实现支持特定缩放选地址、搜索、自定义图标的Google map place picker咨询
推荐核心依赖包
google_maps_flutter:官方维护的Google Maps原生视图封装组件,支持双端一致的地图操作能力google_maps_webservice:Google Maps Places API封装,可直接调用地址搜索、地点详情查询能力geolocator:跨平台定位能力封装,支持快速获取用户当前位置permission_handler:双端定位权限申请处理,适配不同系统版本的权限逻辑
前置配置(双端权限)
iOS端:在Info.plist中添加定位权限声明,配置NSLocationWhenInUseUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescription对应的权限说明文案
Android端:在AndroidManifest.xml中添加ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION权限声明,targetSdkVersion>=33时额外添加POST_NOTIFICATIONS权限
各需求点实现逻辑
1. 初始化自动获取用户当前位置
先通过permission_handler申请定位权限,权限通过后调用geolocator的getCurrentPosition(desiredAccuracy: LocationAccuracy.high)方法获取用户经纬度,拿到坐标后通过GoogleMapController的animateCamera(CameraUpdate.newLatLngZoom(userLatLng, 15))方法移动地图相机到用户位置。
2. 限制仅指定缩放范围内选择地址
在GoogleMap组件初始化时配置minMaxZoomPreference参数,示例:
GoogleMap( // 其他参数省略 minMaxZoomPreference: const MinMaxZoomPreference(12, 18), // 可自定义缩放上下限 zoomGesturesEnabled: true, onCameraMove: (CameraPosition position) { // 可选额外校验:如果缩放超出范围直接重置到边界值 if (position.zoom < 12) { mapController?.moveCamera(CameraUpdate.zoomTo(12)); } else if (position.zoom > 18) { mapController?.moveCamera(CameraUpdate.zoomTo(18)); } }, )
通过该配置用户无法缩放到指定范围外,确保选择地址时的精度符合要求。
3. 自定义图标
所有地图标记的图标都可以通过BitmapDescriptor自定义加载:
// 提前初始化自定义图标 late BitmapDescriptor customMarker; Future<void> _initCustomMarker() async { customMarker = await BitmapDescriptor.fromAssetImage( const ImageConfiguration(size: Size(48, 48)), 'assets/custom_place_picker_icon.png', ); } // 标记中使用自定义图标 Marker( markerId: const MarkerId('selected-place'), position: selectedLatLng, icon: customMarker, )
支持自定义当前位置标记、选中位置标记、搜索结果标记等所有图标的样式。
4. 地址搜索功能
集成google_maps_webservice的Places模块,输入框文字变更时调用自动补全接口获取候选地址列表,用户选中某条地址后调用地点详情接口获取经纬度,移动地图到对应位置后,可调用geocoding接口反向解析获取完整地址信息,包括省市区、街道、门牌号等字段。
内容的提问来源于stack exchange,提问作者AMD

