0

我已经离开 Flutter 和 Dart 一个月了,但是当我看到 Flutter 2 发布时,我决定更新我的一个 Flutter 项目。超级酷的一切,我只喜欢 Flutter 和 Dart。

现在我遇到了一个空安全问题。

Dart 正在抱怨一种方法,我在构建项目时得到了。

Error: A non-null value must be returned since the return type 'String' doesn't allow null.

它抱怨的方法

static String _fmt(String fmt, Object? val, int maxlen) {

  if (null == val) {
    return '';
  }

  // -- Ad support for thousand separators. --
  if (fmt.startsWith('%,') && fmt.endsWith('d')) {
    int i = val as int;
    val = i.toThousandString(',');
    fmt = '%${fmt.substring(2, fmt.length - 1)}s';
  }
  String s = sprintf(fmt, [val]);

  // -- Truncate if text overflows. --
  if (s.length > maxlen) {
    s = s.substring(0, maxlen);
    if (s.length > 1) {
      return s.substring(0, s.length - 2) + '..';
    } else if (s.length > 0 ) {
      return s.substring(0, s.length - 1) + '.';
    }
  } else {
    return s;
  }
}

代码很难看,但除此之外,我看不到此方法中的任何内容都可能返回 null。

还是我傻?

4

1 回答 1

1

您的问题是并非所有代码路径都返回一个值:

if (s.length > maxlen) {
    s = s.substring(0, maxlen);
    if (s.length > 1) {
      return s.substring(0, s.length - 2) + '..';
    } else if (s.length > 0 ) {
      return s.substring(0, s.length - 1) + '.';
    }

    // Nothing will be explicitly returned if control flow reaches here.

  } else {
    return s;
  }

以前这意味着隐式返回null。在那里添加一个返回值或调整你的逻辑,以便覆盖所有可能的路径。

(现在,maxlen可能预计是非负的,这将使得在实践中不可能达到该控制路径,但分析器无法知道这一点。)

于 2021-03-06T08:17:26.630 回答