Flutter 2.0引入零安全后,但在获取字符串变量时,Flutter显示错误-
参数类型"String?"无法分配给参数类型"String"。dart(argument_type_not_assignable(
我想有一个构造函数,如何实现具有Null安全性的构造函数?以及如何获取String变量。
我也使用了toString((方法,但不确定它是否是真正的方法。
class OnbordingSliderTile extends StatelessWidget {
final String? title;
OnbordingSliderTile({this.title});
@override
Widget build(BuildContext context) {
return Container(
//This Text widget is showing the error
child: Text(title)
);
}
}
类型String?
意味着它必须在该类型的变量中具有字符串或null。在您的情况下,可能总是需要一个标题,而这个变量不应该为null。因此,解决方案是将类型更改为String
,并在构造函数中的命名参数中添加required
关键字。
class OnbordingSliderTile extends StatelessWidget {
final String title;
OnbordingSliderTile({required this.title});
@override
Widget build(BuildContext context) {
return Container(
child: Text(title)
);
}
}
我也使用了toString((方法,但不确定它是否是真正的方法
如果在String?
上使用toString()
,它将返回值(如果有(,或者简单地返回"null"
字符串(如果为null(。
您得到的错误是由Text
小部件引起的。它提醒您,您正在以文本形式显示可能包含null
的内容。
UPD:请不要遵循以下建议:
使用Text(title!(而不是Text(title(–Mehran Ullah
这是一种非常糟糕的做法,破坏了零安全的全部要点。这样做意味着你坚持在一个可为null的类型变量中不存在null值,这在大多数情况下是可以避免的,而且是不安全的,因为如果你没有为变量提供值,你可能会导致null错误,这可能是因为你使用的命名参数不是必需的,也没有任何初始值,所以你不能在构造函数中向你的小部件传递任何东西。
UPD
这是推荐的方式吗?因为如果我不希望变量是必需的,该怎么办user4258194
Text
小部件需要一个String
。这是一个位置参数,这意味着它是必需的。没有文本就不能有文本小部件。
在示例小部件中提供它的选项是什么?
答案开头部分所示的必需参数;
具有初始值的可选不可为null的参数:
class OnbordingSliderTile extends StatelessWidget { final String title; //'Placeholder text' will be in title variable if you // haven't provided a value for it when initializing OnbordingSliderTile OnbordingSliderTile({this.title = 'Placeholder text'}); @override Widget build(BuildContext context) { return Container( child: Text(title) ); } }
一个可以为null的参数,没有初始值,在Text窗口小部件中使用时进行null检查:
class OnbordingSliderTile extends StatelessWidget { final String? title; //you can skip providing this parameter to the constructor and then it will be null OnbordingSliderTile({this.title}); @override Widget build(BuildContext context) { return Container( // You have to check if value in your variable is a String, not null // and make sure you provided some text for the case if it null child: Text(title ?? 'Placeholder text') ); } }
如果在未提供值时需要此文本为空,请在任何提供的选项中使用空字符串作为占位符文本。