当 "switch-case" 中有 return 语句时,如何避免 Dart 中的 "no return" 警告?

How to avoid "no return" warning in Dart when there is a return statement in "switch-case"?

我创建了一个代表不同可能间隔的枚举:

enum Interval { day, week, month, year }

在方法 _changePeriod 中,我涵盖了所有可能的情况,但我仍然收到警告“此函数的 return 类型为 'DateRange',但不以 return 声明。

DateRange _changePeriod(DateRange range, int change) {
    DateTime newMoment = change == -1
        ? range.startHour.subtract(Duration(hours: 1))
        : range.finalHour.add(Duration(hours: 1));

    switch (range.interval) {
      case Interval.day:
        {
          return DateRange.day(newMoment);
        }
      case Interval.week:
        {
          return DateRange.week(newMoment);
        }
      case Interval.month:
        {
          return DateRange.month(newMoment);
        }
      case Interval.year:
        {
          return DateRange.year(newMoment);
        }
    }
  }

我知道这“只是”一个警告,但是否有任何选项可以编写更好的代码并更正它?

要么添加一个default语句,然后添加一个return,要么在切换结束后return一个默认值:

方法一:

DateRange _changePeriod(DateRange range, int change) {
  DateTime newMoment = change == -1
      ? range.startHour.subtract(Duration(hours: 1))
      : range.finalHour.add(Duration(hours: 1));

  switch (range.interval) {
    case Interval.day:
      return DateRange.day(newMoment);
    case Interval.week:
      return DateRange.week(newMoment);
    case Interval.month:
      return DateRange.month(newMoment);
    case Interval.year:
      return DateRange.year(newMoment);
    default:
      return null; // or some value
  }
}

方法二:

DateRange _changePeriod(DateRange range, int change) {
  DateTime newMoment = change == -1
      ? range.startHour.subtract(Duration(hours: 1))
      : range.finalHour.add(Duration(hours: 1));

  switch (range.interval) {
    case Interval.day:
      return DateRange.day(newMoment);
    case Interval.week:
      return DateRange.week(newMoment);
    case Interval.month:
      return DateRange.month(newMoment);
    case Interval.year:
      return DateRange.year(newMoment);
  }
  return null; // or some value
}

另一种方法是,当您处理 enum 案例时,您可以确保针对特定 enum.[=18= 检查每个 case 中的所有可能值]

这是 https://github.com/dart-lang/sdk/issues/35710。它将通过 Dart 即将推出的空安全改进来修复(预计在 Dart 2.12 变得稳定时)。在空安全之前,分析器无法判断 switch 表达式永远不会为空,因此无法断定 switch 块之后的代码无法访问。

同时,由于 switch 语句之后的代码在逻辑上应该是不可访问的(假设 switch 表达式不应该是 null),我只是 throw一个错误:

DateRange _changePeriod(DateRange range, int change) {
  ...

  switch (range.interval) {
    case Interval.day:
      return DateRange.day(newMoment);
    case Interval.week:
      return DateRange.week(newMoment);
    case Interval.month:
      return DateRange.month(newMoment);
    case Interval.year:
      return DateRange.year(newMoment);
  }
  throw AssertionError('Unknown interval: ${range.interval}');
}