描述
flutter方法的可选参数,非常方便,但在经过多层级包装和传递后,可能会出现没有注意的细节而掉进坑里:有时我们多层封装控件构造方法或普通方法时,会多层封装可选参数,以为底层的可选参数有默认值,顶层可选参数不传时就是底层可选参数的默认值,实际不是!
可选参数默认值
先看下下面示例:
class OptionParamPage extends StatefulWidget {
final String title;
OptionParamPage({Key key, this.title}) : super(key: key);
@override
_OptionParamPageState createState() => _OptionParamPageState();
}
class _OptionParamPageState extends State<OptionParamPage> {
bool _boolValue;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
alignment: Alignment.center,
width: double.infinity,
height: double.infinity,
child: Text(
TestModel('不传').toString() +
TestModel('传false', boolValue: false).toString() +
TestModel('传定义的空值', boolValue: _boolValue).toString() +'\n'+
_testMethod('不传') +
_testMethod('传false', boolValue: false) +
_testMethod('传定义的空值', boolValue: _boolValue) +'\n'+
'多层包装'+_testModelMethod('不传').toString() +
'多层包装'+_testModelMethod('传false', boolValue: false).toString() +
'多层包装'+_testModelMethod('传定义的空值', boolValue: _boolValue).toString(),
)),
);
}
///方法的可选参数默认值
String _testMethod(String title, {bool boolValue = true}) {
return 'method $title 可选参数bool值为${boolValue ?? 'null'}\n';
}
///包裹方法的可选参数默认值
TestModel _testModelMethod(String title, {bool boolValue}) {
return TestModel(title, boolValue: boolValue);
}
}
class TestModel {
String title;
bool boolValue;
///class构造方法的可选参数默认值
TestModel(this.title, {this.boolValue = true});
@override
String toString() {
return 'class $title 可选参数bool值为${boolValue ?? 'null'}\n';
}
}
效果如下:
效果图.png
从上面例子可以看出:
- 可选参数默认值并不是可选参数传值为空时的值;
- 可选参数的值,实际是传值的值,当传值为null时,即使可选参数有默认值,并且默认值不为null,实际可选参数接收到的值也为null;
- 可选参数默认值没设置时,它的默认值其实为null;
- 多层封装可选参数时,要注意可选参数默认值的变化;
一句话:可选参数没传参时,可选参数的值为默认值,没有默认值则为null;
可选参数有传参时,可选参数值为传参的值,如传参值为null,可选参数默认值不为null,最后可选参数值为null
网友评论