在自定义小部件颤动中使函数参数可选
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
}
括号中的参数是可选的。
带默认值的可选参数
要使用默认值指定可选参数,我们使用 {}
大括号。
在可选的位置参数和可选的命名参数中,如果我们没有在参数中指定值,那么它被设置为 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);
}
我尝试在构造函数中使用一些参数创建一些自定义小部件。此小部件有一些可选和必需的参数。
如何使 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
}
括号中的参数是可选的。
带默认值的可选参数
要使用默认值指定可选参数,我们使用 {}
大括号。
在可选的位置参数和可选的命名参数中,如果我们没有在参数中指定值,那么它被设置为 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);
}