Make Function parameter optional in custom widget

2020-08-17 17:24发布

I try to create some custom widget with some parameter in the constructor. This widget has some optional and required parameter. how can make Function type parameter optional in my Widget.

class TextInputWithIcon extends StatefulWidget {
  final String iconPath;
  final String placeHolder;
  final Function(bool) onFocusChange;
  const TextInputWithIcon(
      {Key key,
      @required this.iconPath,
      this.placeHolder = "",
      this.onFocusChange})
      : super(key: key);

  @override
  _TextInputWithIconState createState() => _TextInputWithIconState();
}

class _TextInputWithIconState extends State<TextInputWithIcon> {
@override
  Widget build(BuildContext context) {
    return MY_WIDGET;
   }
}

标签: dart flutter
2条回答
萌系小妹纸
2楼-- · 2020-08-17 18:11

Optional parameters can be either positional or named, but not both.

Named parameters are optional by default so you don't have to assign the default value.

const TextInputWithIcon(
      {Key key,
      @required this.iconPath,
      this.placeHolder = "",
      this.onFocusChange
})
      : super(key: key);

and when calling the onFocusChange perform a null check:

if(this.onFocusChange != null) {
    this.onFocusChange(boolValue)
}

Have a look at Optional Parameters to understand better.

Edit: Thank you Jonah Williams to clarification.

查看更多
forever°为你锁心
3楼-- · 2020-08-17 18:12

You can use a default value that does nothing:

class TextInputWithIcon extends StatefulWidget {
  final String iconPath;
  final String placeHolder;
  final Function(bool) onFocusChange;
  const TextInputWithIcon(
      {Key key,
      @required this.iconPath,
      this.placeHolder = "",
      this.onFocusChange = _dummyOnFocusChange})
      : assert(onFocusChange != null), super(key: key);

  @override
  _TextInputWithIconState createState() => _TextInputWithIconState();

  static dynamic _dummyOnFocusChange(bool val) {}
}

I created a static named function instead of just a closure as default value, because closures are not const and currently default values need to be const.

I added the assert(...) to ensure that an error is shown when null is passed explicitly.

查看更多
登录 后发表回答