Flutter开发遇NoSuchMethodError:null对象调用placeName getter如何修复?
问题原因
报错为典型的空指针调用异常:构建SearchScreen组件时,代码直接访问了AppData状态中存储的下车地址对象的placeName属性,但此时该地址对象尚未初始化,值为null,触发调用失败。
修复方案
- 检查SearchScreen的build方法中所有引用
placeName的代码,添加空安全处理
所有类似Provider.of<AppData>(context).dropOffLocationAddress.placeName的写法,替换为:Provider.of<AppData>(context).dropOffLocationAddress?.placeName ?? "请选择下车地址" - 初始化
AppData时给下车地址属性赋初始空对象,避免为null
在AppData类中修改属性定义:
同时给// 原来如果是 Address? dropOffLocationAddress; 改成下面的写法 Address dropOffLocationAddress = Address();Address类的所有属性设置默认值:class Address { String placeName = ""; String placeId = ""; double latitude = 0.0; double longitude = 0.0; } - 给主页面的跳转回调添加非空校验,避免未拿到地址就执行导航逻辑
修改main.dart第206行附近的代码:GestureDetector( onTap: () async { var res = await Navigator.push(context, MaterialPageRoute(builder: (context)=>SearchScreen())); if(res == "obtainDirection"){ final appData = Provider.of<AppData>(context, listen: false); // 校验地址信息完整再执行路径规划 if(appData.dropOffLocationAddress.placeName.isNotEmpty) { await getPlaceDirection(); } } }, ) - 优化地址查询接口的字段判空逻辑,避免接口返回异常导致赋值失败
修改searchScreen.dart中的getPlaceAddressDetails方法:void getPlaceAddressDetails(String placeId, context) async{ showDialog(context: context, builder: (BuildContext context) => ProgressDialog(message: "Setting DropOff, Please wait ...",) ); String placeDetailsUrl = "https://maps.googleapis.com/maps/api/place/details/json?place_id=$placeId&key=$mapKey"; var res = await RequestAssistant.getRequest(Uri.parse(placeDetailsUrl)); Navigator.pop(context); if(res == "failed"){ return; } if(res["status"] == "OK") { final result = res["result"]; final geometry = result?["geometry"]; final location = geometry?["location"]; // 校验必填字段非空再赋值 if(result != null && location != null) { Address address = Address(); address.placeName = result["name"] ?? ""; address.placeId = placeId; address.latitude = location["lat"]?.toDouble() ?? 0.0; address.longitude = location["lng"]?.toDouble() ?? 0.0; Provider.of<AppData>(context, listen: false).updateDropOffLocationAddress(address); print("This is Drop Off Location ::"); print(address.placeName); Navigator.pop(context, "obtainDirection"); } } }
内容的提问来源于stack exchange,提问作者Julían Meneses
相关产品推荐
相关产品推荐

