【发布时间】:2021-12-22 15:28:15
【问题描述】:
采用以下非空安全 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 运算符进行“强制解包”可能是不受欢迎的。
所以我的解决方案看起来很老套......所以在这种情况下,将这段代码转换为空安全的优雅、适当甚至性感的方法是什么,如果有多种方法,那么优缺点是什么?
谢谢!
【问题讨论】:
-
您应该在空安全代码中使用
required关键字,而不是旧的@required注释。如果您要求不可为空的命名参数,则默认情况下它们不会为空。 -
问题是有效的。如果我们不想每次都使用构造函数中的所有值,如果需要所有值,我们如何处理这些事情。
标签: flutter dart dart-null-safety null-safety