Flutter/Dart中factory构造函数返回null报Null类型不允许返回错误如何解决
错误原因
这个报错是Dart空安全机制的强制校验导致的:你定义的Directions.fromMap工厂构造函数默认返回类型为非空的Directions,因此不允许返回Null类型的值。
解决方案
你可以根据自己的业务逻辑选择以下任意一种方案:
方案1:将工厂构造函数的返回类型改为可空类型
直接修改构造函数的返回类型声明为Directions?,即可合法返回null,调用方接收后做非空判断再使用即可。
代码示例:
class Directions{ final LatLngBounds bounds; final List<PointLatLng> plylinePoints; final String totalDistance; final String totalDuration; const Directions ({ required this.bounds, required this.plylinePoints, required this.totalDistance, required this.totalDuration }); // 仅修改返回类型为可空的 Directions? 即可 factory Directions? fromMap(Map<String, dynamic> map) { if ((map['routes'] as List).isEmpty) return null; // 后续正常解析逻辑 // ... return Directions( bounds: /* 解析出的bounds */, plylinePoints: /* 解析出的坐标点列表 */, totalDistance: /* 解析出的总距离 */, totalDuration: /* 解析出的总时长 */, ); } }
调用示例:
Directions? directions = Directions.fromMap(responseMap); if (directions != null) { // 路线有效,执行业务逻辑 } else { // 路线为空,对应处理逻辑 }
方案2:抛出异常代替返回null
如果你的业务逻辑中路线为空属于异常情况,不需要上层接收null,可以选择直接抛出异常,上层调用时通过try-catch捕获处理即可。
代码示例:
factory Directions.fromMap(Map<String, dynamic> map) { if ((map['routes'] as List).isEmpty) { throw ArgumentError('返回的路线列表为空,无法构造Directions对象'); } // 后续正常解析逻辑 // ... }
调用示例:
try { Directions directions = Directions.fromMap(responseMap); // 执行业务逻辑 } catch (e) { // 路线为空或解析失败的处理逻辑 }
方案3:用静态方法替代工厂构造
你也可以直接用静态方法实现解析逻辑,和方案1逻辑一致,只是写法上更灵活:
static Directions? fromMap(Map<String, dynamic> map) { if ((map['routes'] as List).isEmpty) return null; // 正常解析逻辑 // ... }
内容的提问来源于stack exchange,提问作者user1043718
相关产品推荐
相关产品推荐

