Dart Future类语法疑问:FutureOr Function(dynamic) onValue含义解析
关于Dart Future中
FutureOr<R> Function(dynamic) onValue语法的通俗解释 嘿,这个问题问到点子上了!我来用大白话给你拆解清楚这两个语法:
先搞懂FutureOr<R>是什么
FutureOr<R>是Dart给我们提供的一个“二选一”的类型——它要么是普通的R类型值(比如int、String这些),要么是返回R类型的Future对象。简单说就是:你可以直接给一个现成结果,也可以给一个还在异步跑的任务,Dart都会帮你处理明白。
再看FutureOr<R> Function(dynamic) onValue
这是一个函数类型的声明,翻译成大白话就是:
- 这是一个函数(用
Function标识) - 这个函数可以接收一个
dynamic类型的参数(啥类型都能传进来) - 这个函数的返回值要么是R类型的普通值,要么是
Future<R>类型的异步任务 - 这个函数的名字叫
onValue(名字只是个标识,换成别的也一样)
对比then方法里的FutureOr<R> onValue(T value)
你看then方法的参数写的是FutureOr<R> onValue(T value),这其实是Dart的语法糖,和前面的FutureOr<R> Function(T)完全等价!只是在函数的参数列表里声明另一个函数时,Dart允许我们省略Function关键字,直接写成「返回值 函数名(参数类型 参数名)」的形式。
放到then的场景里,这个onValue就是Future执行成功后要触发的回调函数:
- 它会接收Future成功返回的结果(类型是T,也就是原Future的泛型类型)
- 你在这个回调里可以直接返回一个普通的R值,也可以返回一个
Future<R>,Dart会自动把两种情况都统一成Future<R>,让后续的链式调用能正常进行。
举个实际例子你就懂了:
// 模拟一个异步任务,返回int类型的Future Future<int> getNumber() => Future.value(10); // 情况1:回调返回普通值 getNumber().then((value) { return value + 5; // 返回int,Dart自动包装成Future<int> }).then((result) { print(result); // 输出15 }); // 情况2:回调返回Future getNumber().then((value) { return Future.delayed(Duration(seconds: 1), () => value + 5); // 返回Future<int> }).then((result) { print(result); // 1秒后输出15 });
两种写法都能正常工作,就是因为onValue的返回值支持FutureOr<R>,Dart帮我们做了兼容处理。
内容的提问来源于stack exchange,提问作者josh
相关产品推荐
相关产品推荐

