如何最好地转换触发 "parameter can't be 'null' but the implicit default value is 'null'." 错误的旧 Dart 代码?
How best to convert old Dart code that triggers "parameter can't be 'null' but the implicit default value is 'null'." error?
采用以下非空安全 Dart 代码:
class RoundedButton extends StatelessWidget {
RoundedButton({this.title, this.color, @required this.onPressed});
final Color color;
final String title;
final Function onPressed;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Material(
elevation: 5.0,
color: color,
borderRadius: BorderRadius.circular(30.0),
child: MaterialButton(
onPressed: onPressed,
minWidth: 200.0,
height: 42.0,
child: Text(
title,
style: TextStyle(
color: Colors.white,
),
),
),
),
);
}
}
关于构造函数的参数,Android Studio 表示,“参数 [parameter] 的值不能为 'null',因为它的类型,但隐式默认值为'null'.
我理解错误并发现我可以像这样简单地修改代码:
class RoundedButton extends StatelessWidget {
RoundedButton({this.title, this.color, required this.onPressed});
final Color? color;
final String? title;
final Function onPressed;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Material(
elevation: 5.0,
color: color,
borderRadius: BorderRadius.circular(30.0),
child: MaterialButton(
onPressed: onPressed.call(),
minWidth: 200.0,
height: 42.0,
child: Text(
title!,
style: TextStyle(
color: Colors.white,
),
),
),
),
);
}
}
通过这种方式,我满足了语言规则,但使用 bang 运算符进行“强制展开”可能是不受欢迎的。
所以我的解决方案似乎很老套...所以在这种情况下,将此代码转换为空安全的优雅、适当甚至性感的方法是什么,如果有多种方法,那么优点和优点是什么缺点?
谢谢!
有几种方法可以迁移到 null 安全代码,如您所说,使所有变量都可为 null 是一种可能的解决方案,这里有另外两个:
1。使变量具有默认值
来自:
final String title;
至:
final String title = '';
或
MyClass {
MyClass({this.title=''});
final String title;
}
何时使用
如果您有一个应该以某个值开头并随着时间的推移而改变的变量,或者如果您有一个不太可能对每个实例都是唯一的变量。
好
int timesOpened = 0;
不好
int uniqueValue = 0 // if it should be unique, it shouldn't be default.
2。在构造函数中强制赋值
来自:
MyClass {
MyClass({this.title});
final String title;
}
至:
MyClass {
MyClass({required this.title});
final String title;
}
何时使用
当您有一个值必须传递给每个实例并且每个实例可能不同时
好
MyClass({required this.onPressed});
不好
MyClass({required this.textSize}); // probably should have a default text size value
如果我是你,我会让 color 有一个默认值,并且 title 和 onPressed 是必需的参数。但你会比我更清楚。
采用以下非空安全 Dart 代码:
class RoundedButton extends StatelessWidget {
RoundedButton({this.title, this.color, @required this.onPressed});
final Color color;
final String title;
final Function onPressed;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Material(
elevation: 5.0,
color: color,
borderRadius: BorderRadius.circular(30.0),
child: MaterialButton(
onPressed: onPressed,
minWidth: 200.0,
height: 42.0,
child: Text(
title,
style: TextStyle(
color: Colors.white,
),
),
),
),
);
}
}
关于构造函数的参数,Android Studio 表示,“参数 [parameter] 的值不能为 'null',因为它的类型,但隐式默认值为'null'.
我理解错误并发现我可以像这样简单地修改代码:
class RoundedButton extends StatelessWidget {
RoundedButton({this.title, this.color, required this.onPressed});
final Color? color;
final String? title;
final Function onPressed;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Material(
elevation: 5.0,
color: color,
borderRadius: BorderRadius.circular(30.0),
child: MaterialButton(
onPressed: onPressed.call(),
minWidth: 200.0,
height: 42.0,
child: Text(
title!,
style: TextStyle(
color: Colors.white,
),
),
),
),
);
}
}
通过这种方式,我满足了语言规则,但使用 bang 运算符进行“强制展开”可能是不受欢迎的。
所以我的解决方案似乎很老套...所以在这种情况下,将此代码转换为空安全的优雅、适当甚至性感的方法是什么,如果有多种方法,那么优点和优点是什么缺点?
谢谢!
有几种方法可以迁移到 null 安全代码,如您所说,使所有变量都可为 null 是一种可能的解决方案,这里有另外两个:
1。使变量具有默认值
来自:
final String title;
至:
final String title = '';
或
MyClass {
MyClass({this.title=''});
final String title;
}
何时使用
如果您有一个应该以某个值开头并随着时间的推移而改变的变量,或者如果您有一个不太可能对每个实例都是唯一的变量。
好
int timesOpened = 0;
不好
int uniqueValue = 0 // if it should be unique, it shouldn't be default.
2。在构造函数中强制赋值
来自:
MyClass {
MyClass({this.title});
final String title;
}
至:
MyClass {
MyClass({required this.title});
final String title;
}
何时使用
当您有一个值必须传递给每个实例并且每个实例可能不同时
好
MyClass({required this.onPressed});
不好
MyClass({required this.textSize}); // probably should have a default text size value
如果我是你,我会让 color 有一个默认值,并且 title 和 onPressed 是必需的参数。但你会比我更清楚。