Flutter 在自定义窗口小部件颤振中使函数参数可选

Flutter 在自定义窗口小部件颤振中使函数参数可选,flutter,dart,flutter-widget,Flutter,Dart,Flutter Widget,我尝试在构造函数中使用一些参数创建一些自定义小部件。这个小部件有一些可选的和必需的参数 如何在我的小部件中使函数类型参数可选 class TextInputWithIcon extends StatefulWidget { final String iconPath; final String placeHolder; final Function(bool) onFocusChange; const TextInputWithIcon( {Key key,

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

如何在我的
小部件
中使
函数
类型参数可选

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;
   }
}
class TextInputWithIcon扩展StatefulWidget{
最终字符串iconPath;
最后一个字符串占位符;
FOCUSCHANGE上的最终功能(bool);
const TextInputWithIcon(
{键,
@需要此.iconPath,
this.placeHolder=“”,
this.onFocusChange})
:super(key:key);
@凌驾
_TextInputWithIconState createState()=>\u TextInputWithIconState();
}
类_TextInputWithIconState扩展状态{
@凌驾
小部件构建(构建上下文){
返回我的_小部件;
}
}
可选参数可以是位置参数也可以是命名参数,但不能同时是位置参数和命名参数


默认情况下,命名参数是可选的,因此不必指定默认值

如果参数是可选的,但不能为null,请提供一个

零安全 没有零安全 用法: 看一看,以便更好地理解


编辑:感谢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) {}
}
我创建了一个静态命名函数,而不仅仅是一个闭包作为默认值,因为闭包不是常量,当前的默认值需要是常量


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

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

括号中的参数是可选的


带有默认值的可选参数

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

在可选位置参数和可选命名参数中,如果未在参数中指定值,则将其设置为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);
}

你有什么错误?它是静态的还是运行时的?@GünterZöchbauer。如果函数未设置
方法“call”是在null上调用的。
这不是关于参数是可选的,而是关于没有函数传递给该参数,那么当然不能调用它。你能解释一下预期的行为是什么吗?我试图在父窗口小部件的“TextField”中改变焦点。但是仅仅在某些屏幕中,焦点更改并不重要组件如何处理它并不重要?onFocusChange不需要初始化为null。使命名参数可选不需要赋值吗?命名参数由default@UmairM对于空安全性,需要相同的解决方案。请分享任何建议。谢谢。@Kamlesh我更新了答案,如果我遗漏了什么,请告诉我:)如果我的函数不带参数也不返回任何内容,它将是>>(static _dummyOnFocusChange(){})是这样正确的,因为我在编译时尝试并给出了错误,所以我尝试了(static dynamic _dummyOnFocusChange(){})并与我一起工作。你能告诉我为什么工作吗?如果你需要传递一个参数取决于FOCUSCHANGE上的
最终函数(bool)
。如果您不打算返回任何内容,请使用
void
<代码>动态是一种通配符。对于我的情况,我需要传递一个自定义模型。我不能只声明整个模型如果为空,我需要额外的信息,它不是there@GünterZöchbauer我们如何传递可选参数并在自定义小部件中使用它们?请建议。谢谢
function_name (argument1, [argument2]) {
   // statements
}
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);
}