32

我尝试在构造函数中创建一些带有一些参数的自定义小部件。这个小部件有一些可选和必需的参数。

如何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

4 回答 4

55

可选参数可以是位置参数或命名参数,但不能两者兼有。

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

如果参数是可选的但不能为空,则提供默认值

具有零安全性

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

  }

查看可选参数以更好地理解。

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

于 2019-01-30T16:02:18.700 回答
9

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

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

于 2019-01-30T16:08:27.323 回答
8

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

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

括号中的参数是可选的。

来源

于 2021-02-02T10:33:10.077 回答
6

具有默认值的可选参数

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

在可选的位置参数和可选的命名参数中,如果我们没有在参数中指定值,那么它被设置为 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);
}
于 2021-05-10T03:51:12.513 回答