【问题标题】:What's the meaning of passing underscore _ "_" (_) when calling a function in dart/flutter?dart/flutter中调用函数时传递下划线_“_”(_)是什么意思?
【发布时间】:2019-10-09 07:56:33
【问题描述】:

在阅读 dart 代码时,我经常会看到一些仅使用下划线 _ 参数调用的函数。它困扰了我一段时间,由于颤振改进了它的分析消息,我有一些线索......但我觉得我并没有真正理解这个概念:-(

昨天我写了以下测试:

when(mockDevice.getLocalPath()).thenAnswer(() async => fileFolder);

并得到以下分析

错误:不能将参数类型“Future Function()”分配给参数类型“Future Function(Invocation)”。

添加下划线时效果很好。

when(mockDevice.getLocalPath()).thenAnswer((_) async => fileFolder);

我遇到的最可怕的例子来自@remi rousselet 写的provider package

builder: (_, counter, __) => Translations(counter.value),

来自提供者示例:

Widget build(BuildContext context) {
  return MultiProvider(
    providers: [
      ChangeNotifierProvider(builder: (_) => Counter()),
      ProxyProvider<Counter, Translations>(
        builder: (_, counter, __) => Translations(counter.value),
      ),
    ],
    child: Foo(),
  );
}

class Translations {
  const Translations(this._value);

  final int _value;

  String get title => 'You clicked $_value times';
}

【问题讨论】:

  • 我第一次投反对票。我是否应该理解我的问题被视为需要讨论而不是回答?我一直在寻找答案,而我带有许多下划线的奇怪标题是因为很难在互联网上寻找 (_) ;-)

标签: flutter dart


【解决方案1】:

下划线通常表示您不会在块内使用该参数,这只是编写代码的好方法,例如:

method(int useful, int useless) {
  // say I am only going to use 'useful' in this block 
}

上面的代码也可以写成:

method(int useful, int _) {
  // using '_' means I'm not going to use 2nd parameter in the block
}

现在回答您的问题:

builder: (_, counter, __) => Translations(counter.value),

表示你有3个参数_counter__,并且只有counter是你使用的,所以第一个和第三个参数用___表示。这只是编写代码的更简洁的方式。

【讨论】:

  • 所以,除了团队合作的目的之外,我可以写任何我想要的东西而不是 _ 并且使用 _ 只是一个不言而喻的约定?此外,我们仅将其用于回调,非 void 回调,因为我们在普通函数中使用可选参数?
  • 是的,这只是未说明的约定,你可以写任何你想写的东西。同样是的,我们通常将它用于回调。
  • 我认为这是在 Node.js 上实现了一些方法。例如,在某些方法中,我们传递参数 req、res、next,但我们只使用 req 或 res(但即使您不使用参数,也需要实现该参数)。这不是我在 JavaScript 中看到的做法,但我现在建立了关联
【解决方案2】:

在 Dart(flutter 的基础语言)中,如果一个类、类成员、变量以下划线开头,则表示它是其库私有的。这就是 dart 通常处理封装的方式,而 Java 则使用私有、受保护和公共等关键字。

【讨论】:

  • 我认为这不是OP问题的情况
猜你喜欢
  • 2014-10-20
  • 2022-12-07
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2017-09-25
  • 2021-03-28
相关资源
最近更新 更多