then<R> 抽象方法

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

注册回调,当此Future完成时将被调用。

当此Future完成并带有值时,将使用该值调用onValue回调。如果此Future已经完成,则回调不会立即调用,而是将在后续的微任务中安排调用。

如果提供了onError,并且此Future完成时带有错误,则使用该错误和其堆栈跟踪调用onError回调。onError回调必须接受一个或两个参数,其中后者是StackTrace。如果onError接受两个参数,则它将同时使用错误和堆栈跟踪进行调用,否则它只使用错误对象。onError回调必须返回一个值或Future,该值或Future可以用来完成返回的Future,因此它必须是可分配给FutureOr<R>的。

返回一个新的Future,该Future在调用onValue的结果完成(如果此Future完成并带有值)或调用onError(如果此Future完成并带有错误)。

如果调用的回调抛出异常,则返回的Future将以抛出的错误和错误的堆栈跟踪完成。在onError的情况下,如果抛出的异常与onError的错误参数相同,并且它是同步抛出的,则抛出被认为是重新抛出,并使用原始堆栈跟踪代替。要在异步回调中使用相同的堆栈跟踪重新抛出,请使用Error.throwWithStackTrace

如果回调返回一个Future,则then返回的Future将以回调返回的Future相同的結果完成。

如果没有提供onError,并且此Future完成时带有错误,则错误将直接转发到返回的Future。

在大多数情况下,单独使用catchError(可能带有test参数)比在单个then调用中处理值和错误更易于阅读。

请注意,Future不会延迟报告错误直到监听器被添加。如果在此Future完成并带有错误之后发生第一个thencatchError调用,则错误被视为未处理的错误。请参阅Future上的描述。

实现

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