在自定义小部件颤动中使Function参数为可选

时间:2019-01-30 15:51:38

标签: dart flutter

我尝试在构造函数中使用一些参数创建一些自定义小部件。该小部件具有一些可选的和必需的参数。如何使Function中的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;
   }
}

4 个答案:

答案 0 :(得分:3)

如果你不喜欢命名参数(比如我:/)的另一个选择是:

function_name (argument1, [argument2]) {
   // statements
}

括号中的参数是可选的。

source

答案 1 :(得分:2)

  

可选参数可以是位置参数或名称,但不能同时使用。

默认情况下,命名参数是可选的,因此您不必分配默认值。

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

,并在调用onFocusChange时执行空检查:

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

看看Optional Parameters可以更好地理解。

编辑:谢谢乔纳·威廉姆斯的澄清。

答案 2 :(得分:2)

具有默认值的可选参数

要使用默认值指定可选参数,我们使用 {} 大括号。

在可选的位置参数和可选的命名参数中,如果我们没有在参数中指定值,则将其设置为 NULL。

function_name (argument1, {argument2 = default_value}) {
  // statements
}

调用函数的语法

// if you want to override new value
function_name(argumentName : value); 

样品

ShowMyDetails(String name,
 {String lastName = "Sanket", int age = 20}){
  print(name);
  print(lastName);
  print(age);
}

main() {
  ShowMyDetails("Jay", age: 24);
}

答案 3 :(得分:1)

您可以使用不执行任何操作的默认值:

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) {}
}

我创建了一个静态的命名函数,而不只是将闭包作为默认值,因为闭包不是const,并且当前默认值必须是const。

我添加了assert(...),以确保在显式传递null时显示错误。