首页 > 解决方案 > 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不应用填充。

我怎样才能做到这一点?

标签: flutterdart

解决方案


在您的情况下,为什么不让默认值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.
  }
} 

推荐阅读