Dart 空安全 - 返回一个 none 可为空的类型

Dart null safety - Returning a none nullable type

我对新的 Dart Null Safety 完全陌生,我正在尝试转换我的一个项目并学习它。我对函数收到的一个错误有点困惑,它返回一个类型。这是代码:

Exercise getExerciseByID(String exerciseId) {
for (var exercise in _exercises) {
  if (exercise.id == exerciseId) {
    return exercise;
  } 
}
}

我收到的错误如下:

The body might complete normally, causing 'null' to be returned, but the return type, 'Exercise', is a potentially non-nullable type. (Documentation) Try adding either a return or a throw statement at the end.

我想知道在这种情况下我应该做什么/返回什么?对此的任何建议都会非常有帮助。非常感谢。

因为你这里隐含了return null。如果 if 语句中的 none 将被执行,excersise 将不会被 returned,因此结果将为空。

Exercise getExerciseByID(String exerciseId) {
for (var exercise in _exercises) {
  if (exercise.id == exerciseId) {
    return exercise;
  } 
}
 return null; //this is what it complains, that the result might be null while you declare non null response
}

选项(备选方案):

  1. 将 return 声明更改为可空类型 (jamesdlin) Exercise?
  2. 最后抛出异常而不是 returning null
  3. 总是 return 某些东西 - 例如默认值或 'nothing found value'

您收到该错误是因为您的 return 语句在 if 条件内,因此它假设它可能永远不会 return 一个值(如果所有条件都失败)。所以这可能是适合您的解决方案:

Exercise getExerciseByID(String exerciseId) {
    // initialize some default value to return if all conditions fail
    Exercise returnValue = Exercise();
    for (var exercise in _exercises) {
      if (exercise.id == exerciseId) {
        // if found update your initial value with found one
        returnValue = exercise;
        // stop for loop after finding right value
        break;
      }
    }
    return returnValue;
  }

在方法末尾添加 return 以防 if 条件不成立。

或者您可以使用简单的 firstWhere 方法,例如:

return _exercises.firstWhere((exercise) => exercise.id == exerciseId);