集成Google Maps与Places API问题:搜索选点后地图不居中且地址未更新
问题解决方案
核心问题
选中搜索建议时,仅更新了输入框文本和清空建议列表,未调用getPlaceDetails方法获取选中地点的坐标信息,也未更新地图位置和地址文本。
修复步骤
修改搜索建议列表项的onTap回调,添加获取地点ID并调用详情接口的逻辑:
ListTile( leading: Icon(Icons.location_on_outlined, color: AppColors.appbarColor), title: Text( _placeList[index]["description"], style: TextStyle(color: Colors.black), ), onTap: () async { // 获取选中地点的place_id String placeId = _placeList[index]["place_id"]; // 调用详情接口获取坐标并更新地图、地址 await getPlaceDetails(placeId); setState(() { _controller.text = _placeList[index]["description"]; _placeList.clear(); }); }, ),
额外优化建议
- 统一API Key:当前
getSuggestion和getPlaceDetails使用了不同的API Key,建议定义一个全局常量统一管理,避免出错:
const String PLACES_API_KEY = "AIzaSyAGEtunBXnzTCQkBaUJI4mzBQpw3X_C_6c";
- SessionToken初始化优化:
initState中可以直接初始化_sessionToken为uuid,避免后续判断空值:
@override void initState() { super.initState(); // ...其他初始化代码 _sessionToken = uuid.v4(); _controller.addListener(() { _onChanged(); }); }
- 空安全检查:处理API返回数据时,建议添加空值判断,避免空指针异常,比如在
getPlaceDetails中:
if (data['result'] != null && data['result']['geometry'] != null) { double lat = data['result']['geometry']['location']['lat']; double lng = data['result']['geometry']['location']['lng']; // ...后续逻辑 } else { // 处理数据异常情况 ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("无法获取地点信息"))); }
内容的提问来源于stack exchange,提问作者Tanu Purohit
相关产品推荐
相关产品推荐

