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

Make Function parameter optional in custom widget 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;
   }
}

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

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

If a parameter is optional but can’t be null, provide a default value.

零安全

class TextInputWithIcon extends StatefulWidget {
  final String iconPath;
  final String placeHolder;
  final Function(bool)? onFocusChange; // nullable and optional
  
  const TextInputWithIcon(
      {Key? key,
      required this.iconPath, // non-nullable and required
      this.placeHolder = "", // non-nullable but optional with a default value
      this.onFocusChange, // nullable and optional
      })
      : super(key: key);

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

}

没有空安全

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

用法:

void _focusChanged(bool value) {

    // using null-aware operator (for both with and without null safety)
    onFocusChange?.call(value);
    
    // or without null-aware operator 
    
    // with null safety
    if(onFocusChange != null) {
      onFocusChange!(value);
    }

    // without null safety
    if(onFocusChange != null) {
      onFocusChange(value);
    }

  }

Dart 2.17 更新:

Although it often makes sense to place positional arguments first, named arguments can be placed anywhere in the argument list when it suits your API:

repeat(times: 2, () {
  ...
});

看看 Optional Parameters 以更好地理解。

编辑:感谢 Jonah Williams 的澄清。

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

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 时显示错误。

如果您不喜欢命名参数(比如我:/),另一个选项是:

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

括号中的参数是可选的。

source

带默认值的可选参数

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

在可选的位置参数和可选的命名参数中,如果我们没有在参数中指定值,那么它被设置为 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);
}