You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:06:07