根据“Future.catchError”的要求,返回类型“void”不可分配给“FutureOr<T>”

sha*_*ais 4 dart

我有一些这样的代码:

File("foo.txt").readAsString().catchError((e)=>print(e));

编译器正在抱怨 info: The return type 'void' isn't assignable to 'FutureOr<T>', as required by 'Future.catchError'.

我似乎无法给它想要的东西,也无法在任何文档中找到一个清晰的使用示例(只是 git 中的一个很长的问题,关于有多少种错误使用它的方法)。如果我从表面上看文档,我应该能够返回一个 bool 或一个 future,两者都不会让分析器满意。

我如何提供这个 FutureOr?

jam*_*lin 12

的文档Future.catchError可能会更清楚,但相关部分是:

onErrorthen被调用时带有错误和可能的堆栈跟踪,并且返回的 future 是通过此调用的结果完成的,其方式与for 的方式完全相同onError

交叉引用 的文档Future.then,相关部分是:

回调onError必须返回一个可用于完成返回的 future 的值或 future,因此它必须是可分配给 的内容FutureOr<R>

由于File.readAsString返回 a Future<String>,因此您的catchError回调也必须返回 a Future<String>(或 a String)。这样做的例子:

File("foo.txt").readAsString().catchError((e) {
  print(e);
  return Future.value('');
});

File("foo.txt").readAsString().catchError((e) async {
  print(e);
  return '';
});
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,这是有道理的;因为给定:

String value = await File("foo.txt").readAsString().catchError(...);
Run Code Online (Sandbox Code Playgroud)

那么如果readAsString成功,value应该分配一个String. 如果失败,由于您捕获了异常而不重新抛出它,因此value仍然需要分配一个String.

换句话说,您的代码相当于:

Future<String> readFoo() async {
  try {
    return await File("foo.txt").readAsString();
  } catch (e) {
    print(e);
  }
  // Oops, missing return value.
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我强烈建议使用async/awaittry-catch而不是使用.catchError,这样可以避免这种混乱。