Flutter获取谷歌地图地点搜索结果及google_maps_place_picker版本冲突解决
你之前直接跳转系统谷歌地图APP的实现方案无法获取用户搜索后的地点结果,因为外部应用不会主动回传数据到你的APP,必须在应用内实现地点选择功能,以下是版本冲突解决及功能实现方案:
版本冲突解决方法
方案1:依赖版本覆盖
直接在你的pubspec.yaml文件中添加依赖覆盖节点,强制指定项目当前使用的provider和http版本,无需降级现有依赖:
dependency_overrides: provider: ^6.0.1 http: ^0.13.4
添加完成后重新执行flutter pub get即可解决版本冲突。
方案2:替换维护中的新版本包
你当前使用的google_maps_place_picker 1.0.1版本已经停止维护,适配的依赖版本过低,你可以替换为该包的社区维护分叉版,默认适配高版本的provider和http,无需额外配置覆盖规则。
功能实现步骤
- 先前往谷歌云控制台开通以下服务,获取API密钥:
- Maps SDK for Android
- Maps SDK for iOS
- Places API
- 在原生项目中配置API密钥:
- Android端在
AndroidManifest.xml的application节点下添加meta-data配置密钥 - iOS端在
Info.plist中添加GMSServicesKey字段配置密钥
- Android端在
- 替换原有跳转逻辑,改为应用内打开地点选择页,示例代码如下:
// 先在状态类中定义文本控制器,用于后续显示选中地址 final TextEditingController _addressController = TextEditingController(); // 替换原有的InkWell点击逻辑 InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => PlacePicker( apiKey: "你申请的谷歌API密钥", onPlacePicked: (Place result) { // 选中地点后回调,先打印到控制台 print("选中地点名称:${result.name}"); print("完整地址:${result.formattedAddress}"); print("经纬度:${result.geometry?.location.lat}, ${result.geometry?.location.lng}"); // 需要显示到文本框直接赋值给控制器即可 setState(() { _addressController.text = result.formattedAddress ?? ""; }); // 关闭地点选择页 Navigator.pop(context); }, initialPosition: LatLng(_currentPosition.latitude, _currentPosition.longitude), useCurrentLocation: true, ), ), ); }, child: const Text("选择地点"), ), // 页面中添加显示地址的文本框 TextField( controller: _addressController, decoration: const InputDecoration(hintText: "选中的地址会显示在这里"), readOnly: true, )
如果不想依赖第三方地点选择组件,也可以直接调用谷歌Places Autocomplete接口自行实现搜索功能,完全自主可控,不会产生额外依赖冲突问题。
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

