有没有比这样做更简单(更干净)的方法将可选参数从一个函数传递到另一个函数:

void optional1({num x, num y}) {
  if (?x && ?y) {
    optional2(x: x, y: y);
  } else if (?x) {
    optional2(x: x);
  } else if (?y) {
    optional2(y: y);
  } else {
    optional2();
  }
}

void optional2({num x : 1, num y : 1}) {
   ...
}

我真正想打的电话是:

void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh])

至少我没有得到位置可选参数的组合爆炸,但我仍然希望有一些比大量的If-Else更简单的东西.

我有一些代码使用了第一个答案中提出的解决方案(传播命名可选参数的默认值,但我无法判断该值是否由初始调用方提供).

推荐答案

我已经被dart 的这个角落灼伤过好几次了.我鼓励任何人采纳我目前的指导方针是:

  1. Do not use default values.取而代之,使用隐式默认值null,并在函数体中判断该值.记录如果传递null将使用什么值.
  2. Do not use the 100 argument test operator.,只需测试null.

这使得不传递参数和显式传递null完全相等,这意味着您始终可以通过显式传递参数来转发.

因此,上述内容将变成:

void optional1({num x, num y}) {
  optional2(x: x, y: y);
}

/// [x] and [y] default to `1` if not passed.
void optional2({num x, num y}) {
   if (x == null) x = 1;
   if (y == null) y = 1;
   ...
}

我认为这个模式更干净,更容易维护,使用默认值,避免了需要转发时令人讨厌的组合爆炸.当您用可选参数重写方法或实现接口时,它还可以避免重复默认值.

然而,DART世界中有一个角落是不起作用的:DOM.?运算符专门用于解决这样一个事实,即在某些JavaScript DOM方法中,传递null与传递undefined不同(即不传递任何内容).

如果您试图在Dart中使用内部使用?的DOM方法,则必须处理组合爆炸.我个人希望我们能修复这些API.

但是,如果您只是在编写自己的DART代码,我真的建议您避免使用默认值和?.您的用户会为此感谢您的.

Dart相关问答推荐

Flutter Drawer 作为单独的小部件不允许修改宽度

FlutterError (setState() 在 dispose() 之后调用:(生命周期状态:defunct,not mounted)

Flutter - 自定义按钮点击区域

如何使用 Android aar 文件构建 Flutter 项目?

如何用 Flutter 在同屏路由上制作英雄风格的动画?

访问用户环境变量

dart中整数的最大值是多少?

我如何在屏幕上弹出特定的Flutter

如何在Dart中创建空Map

有没有更好的方法来解析 Dart 中的 int

错误:无法调用需要 const 表达式的非const构造函数

如何左对齐 Flutter 中的 OutlineButton 图标

Dart Nodejs 和 Socketio

Dart,对泛型的限制?

Null aware函数调用运算符

在 Dart 中覆盖哈希码的好方法是什么?

Dart,如何在你自己的函数中创建一个返回的future ?

如何在 Dart 中运行重复出现的函数?

将方法或值添加到 dart 中的枚举

如何在 Dart 中获取时间戳?