then<R> 抽象方法

Future<R> then<R>(
  1. FutureOr<R> onValue(
    1. T value
    ),
  2. {Function? onError}
)

在当前 Future 完成时注册需要调用的回调函数。

当这个 Future 使用一个值完成时,onValue 回调函数会使用这个值被调用。如果这个 Future 已经完成,回调函数不会立即调用,而是会被安排在一个后续的微任务中。

如果提供了 onError,且这个 Future 因为错误而完成,那么会调用 onError 回调函数,并传递错误及其堆栈跟踪。如果 onError 接受两个参数,它会同时调用错误和堆栈跟踪,否则只调用错误对象。onError 回调函数必须返回一个值或可以用来完成返回 Future 的 future,因此它必须是可赋值给 FutureOr<R> 的。

返回一个新的

如果调用的回调抛出异常,返回的 future 会用抛出的错误及其堆栈跟踪完成。在 onError 的情况下,如果抛出的异常与 onError 参数中的错误相同,并且是同步抛出的,那么这个抛出被认为是重新抛出,并使用原始的堆栈跟踪。为了在异步回调中使用相同的堆栈跟踪重新抛出,请使用 Error.throwWithStackTrace

如果回调返回一个 Future,那么 then 返回的 future 会与回调返回的 future 使用相同的结果完成。

如果没有提供 onError,并且这个 Future 传入了一个错误,那么错误会被直接转发到返回的 future。

在大多数情况下,独立使用 catchError(可选带有 test 参数),而不是在一个 then 调用中处理值和错误,会更加易读。

请注意,futures 不会延迟错误报告直到添加了监听器。如果在 future 使用错误完成之后发生了第一个 thencatchError 调用,那么误差会被报告为未处理的错误。请参阅 Future 的描述。

实现

Future<R> then<R>(FutureOr<R> onValue(T value), {Function? onError});