flutter - Flutter:区分 Widget param = null 和未设置的参数
问题描述
我有一个CustomButton
这样的:
class CustomButton extends StatelessWidget {
const CustomButton(
{Key key, this.onPressed, this.child, this.padding})
: super(key: key);
final VoidCallback onPressed;
final Widget child;
final EdgeInsetsGeometry padding;
@override
Widget build(BuildContext context) {
final defaultPadding = EdgeInsets.symmetric(vertical: 13);
return FlatButton(
padding: padding ?? defaultPadding,
child: child,
onPressed: onPressed,
// + some irrelevant custom properties
);
}
}
我已经包含了小部件的各种应用程序,以及期望的结果:
CustomButton(child: Text(''), onPressed: () {}) // 1⃣ no padding specified; use default
CustomButton(..., padding: null) // 2⃣ use NO padding
CustomButton(..., padding: EdgeInsets.only(left:1)) // 3⃣ use specified padding
问题是我无法区分何时padding
未通过 1⃣ 和何时padding: null
通过 2⃣ 。在这两种情况下,defaultPadding
都应用了——而我希望padding: null
不应用填充。
我怎样才能做到这一点?
解决方案
在您的情况下,为什么不让默认值padding
成为您想要的默认值?EdgeInsets.symmetric
是一个const
构造函数,所以它可以用来创建一个默认参数:
class CustomButton extends StatelessWidget {
static const defaultPadding = EdgeInsets.symmetric(vertical: 13);
const CustomButton(
{Key key, this.onPressed, this.child, this.padding = defaultPadding})
: super(key: key);
通常,您应该尽可能使用默认参数。??
当你不能使用默认值时(因为你想要的默认值不是const
),或者当你确实想要null
并且以相同方式处理省略的参数时,你会使用默认值。
通常,没有内置方法来区分显式传递的默认值和使用的默认值,因为它被省略了。在某些情况下,您可能会创建一个哨兵值,该值对于您库外的调用者来说是不可能通过的:
class Foo {
const Foo(this.x);
final int x;
}
// Private so that nothing outside the library can pass it.
const _defaultFoo = Foo(0);
void bar({Foo foo = _defaultFoo}) {
if (foo == _defaultFoo) {
// Argument omitted.
} else {
// Argument was explicitly supplied.
}
}
推荐阅读
- git - 如何“恢复”由于合并冲突而中止的合并后挂钩?
- java - 如何将pdf文件转换为docx文件
- c++ - 如何简化代码并将switch合并为一个功能?
- assembly - CALL 指出内存范围外 - 程序集
- reactjs - 是否有其他方法来定义“图像”属性
- javascript - 在 Javascript 和 MATLAB 中计算 pi - 不同的速度
- amazon-web-services - AWS IAM 强制 MFA,但允许第一次更改密码
- android - RecyclerView 与仅按钮适配器
- java - 有没有办法实现与 Java 中的下划线选择功能相同的功能?如果是这样,如何?
- ios - Xcode 11 Module AppRegistry 不是注册的可调用模块(调用runApplication)