Flutter插件google_maps_webservice的fields参数报错求助
Flutter google_maps_webservice插件getDetailsByPlaceId调用报错排查
问题背景
使用google_maps_webservice^0.0.20-nullsafety.5插件调用getDetailsByPlaceId方法时,添加fields: ['name']参数后持续触发类型转换错误,注释该参数则可正常运行,但需要此参数减少API调用成本。
方法签名:
Future getDetailsByPlaceId( String placeId, { String? sessionToken, List fields = const [], String? language, String? region, })
调用代码
PlacesDetailsResponse detail = await _places.getDetailsByPlaceId( p.placeId.toString(), fields: ['name'], // 注释该行可正常运行,但需此参数节省成本 language: 'fr', region:"fr", );
报错信息
E/flutter ( 9854): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'Null' is not a subtype of type 'String' in type cast E/flutter ( 9854): #0 _$PlaceDetailsFromJson (package:google_maps_webservice/src/places.g.dart:138:31) E/flutter ( 9854): #1 new PlaceDetails.fromJson (package:google_maps_webservice/src/places.dart:710:7) E/flutter ( 9854): #2 _$PlacesDetailsResponseFromJson (package:google_maps_webservice/src/places.g.dart:294:26) E/flutter ( 9854): #3 new PlacesDetailsResponse.fromJson (package:google_maps_webservice/src/places.dart:838:7) E/flutter ( 9854): #4 GoogleMapsPlaces._decodeDetailsResponse (package:google_maps_webservice/src/places.dart:528:29) E/flutter ( 9854): #5 GoogleMapsPlaces.getDetailsByPlaceId (package:google_maps_webservice/src/places.dart:126:12) E/flutter ( 9854): E/flutter ( 9854): #6 _LocationPickerInitialState.goToPlace (package:myproj/screens/maps/initialOwnerLocationpicker.dart:149:11)
原因与解决办法
原因
报错指向插件自动生成的序列化文件places.g.dart,说明当仅指定fields: ['name']时,Google Places API返回的响应中缺少PlaceDetails模型类中某些被标记为非空的字段值,插件的序列化代码强制将这些空值转为String类型,触发类型转换异常。
解决办法
- 补充必填字段:在
fields参数中添加插件序列化依赖的核心字段,至少包含place_id(模型类必须依赖此字段完成反序列化),修改为:
可根据插件源码中fields: ['name', 'place_id']PlaceDetails的定义,确认其他必填字段并补充。 - 升级插件版本:该版本的空安全处理可能存在缺陷,尝试升级到最新稳定版,大概率已修复此类序列化兼容问题。
- 自定义序列化逻辑:若无法升级插件,可自行解析API返回的JSON数据,跳过插件自带的序列化流程,直接提取所需字段。
内容的提问来源于stack exchange,提问作者Le Pepe
相关产品推荐
相关产品推荐

