我正在学习Dart,并经常看到以下习语:
someFuture.then((_) => someFunc());
我也见过类似的代码:
someOtherFuture.then(() => someOtherFunc());
这两个例子在功能上有区别吗?也就是说,将_
作为参数传递给Dart函数有什么作用?
考虑到Dart使用_
作为声明私有函数的前缀,这一点尤其令人困惑。
它是一个名为_
的变量,通常是因为您计划不使用它并将其丢弃。例如,您可以使用名称x
或foo
。(_)
和()
之间的区别很简单,一个函数接受一个参数,而另一个不接受。
对于非私有标识符,不要使用前导下划线
异常:未使用的参数可以命名为_、__、___等发生在回调之类的事情中,在回调中,您被传递了一个值,但您不需要使用它。给它一个仅由下划线是表示未使用该值的惯用方式。
https://dart.dev/guides/language/effective-dart/style
下划线(_
)通常表示您不会在块中使用此参数。这只是编写代码的一种巧妙方式。
假设我有一个有两个参数useful
和useless
的方法,并且我在代码块中没有使用useless
:
void method(int useful, int useless) {
print(useful);
}
由于不会使用useless
变量,我应该将上面的代码写成:
void method(int useful, int _) { // 'useless' is replaced with '_'
print(useful);
}
对于未使用的回调参数,从Dart Doc-PREFER使用_
、__
等。
有时回调函数的类型签名需要参数,但回调实现不使用参数在这种情况下,命名未使用的参数是惯用的
_
。如果函数有多个未使用的参数,请使用其他参数避免名称冲突的下划线:__
、___
等futureOfVoid.then((_) { print('Operation complete.'); });
本指南仅适用于匿名和本地。这些函数通常在上下文中立即使用在那里可以清楚地看到未使用的参数代表什么。相反顶级函数和方法声明没有该上下文,所以它们的参数必须命名,这样才能清楚地知道每个参数参数是for,即使它并没有被使用。
在DartPad中复制粘贴以下代码并点击Run-
void main() {
Future.delayed(Duration(seconds: 1), () {
print("No argument Anonymous function");
});
funcReturnsInteger().then((_) {
print("Single argument Anonymous function " +
"stating not interested in using argument " +
"but can be accessed like this -> $_");
});
}
Future<int> funcReturnsInteger() async {
return 100;
}
该表达式类似于node.js中的"回调",该表达式与异步任务有关。
首先记住,=> expr
表达式是{return *expr*}
的简写,现在在someFuture.then((_) => someFunc())
中,someFuture
是Future
类型的变量,这将保留异步任务,使用.then
方法可以告诉如何处理异步任务(一旦完成),在该方法中使用args可以放回回调((response) => doSomethingWith(response))
。
您可以在Dart中的基于未来的API和函数中了解更多信息。感谢
非常常见的用法是,当我们需要用Navigator推送一条新路线,但生成器中的上下文变量不会被使用时:
// context is going to be used
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => NewPage(),
));
// context is NOT going to be used
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => NewPage(),
));
我认为人们在这里感到困惑的是,许多人认为中的_
someFuture.then((_) => someFunc());
是一个提供给回调函数的参数,这是错误的,它实际上是从函数传递回来的一个参数,你可以给它一个你想要的名称(当然,保留关键字除外),在这种情况下,它是一个下划线,表示不会使用该参数。否则,您可以执行类似上面给出的示例的操作:((response) => doSomethingWith(response))