Flutter运行报NoSuchMethodError,调用placeName getter时接收器为null如何解决
错误原因
报错核心是Provider.of<AppData>(context).pickUpLocation这个对象为null,你直接调用了它的placeName属性,空对象调用getter方法触发了NoSuchMethodError。
你代码里写的?? ""仅能处理placeName本身为null的情况,无法覆盖pickUpLocation为null的场景,所以还是会抛出异常。
解决方案
- 方案1:使用空安全调用符
?.兼容空对象场景,修改代码如下:
String placeAddress = Provider.of<AppData>(context).pickUpLocation?.placeName ?? "";
该写法会先判断pickUpLocation是否为null,若为null则整体返回null,自动触发后续的?? ""逻辑赋值为空字符串,不会抛出异常。
方案2:从业务逻辑层面保证进入SearchScreen页面前,
AppData内的pickUpLocation已经完成初始化赋值,比如在启动页/首页先完成定位逻辑,给pickUpLocation赋有效值后再跳转至搜索页,从根源避免对象为空的情况。方案3:增加加载态兜底,当
pickUpLocation为空时先展示加载提示,等赋值完成后再渲染页面内容,示例代码如下:
@override Widget build(BuildContext context) { final appData = Provider.of<AppData>(context); // 判空兜底 if (appData.pickUpLocation == null) { return Scaffold( body: Center(child: CircularProgressIndicator()), ); } // 原有逻辑 String placeAddress = appData.pickUpLocation.placeName ?? ""; pickUpTextEditingController.text = placeAddress; // 剩余页面逻辑... }
内容的提问来源于stack exchange,提问作者kishor420
相关产品推荐
相关产品推荐

