Flutter 2.0 引入空安全后,Flutter 获取 String 变量时却显示错误 -
<块引用>参数类型“字符串?”无法分配给参数类型 'String'.dart(argument_type_not_assignable)
我想要一个构造函数,如何用空安全实现构造函数?还有如何获取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)
);
}
}
答案 0 :(得分:1)
Type String?
表示该类型的变量中必须有字符串或空值。在您的情况下,您可能总是需要一个标题,并且此变量不应为空。
所以解决方案是将类型改为String
,并在构造函数中的命名参数中添加required
关键字。
class OnbordingSliderTile extends StatelessWidget {
final String title;
OnbordingSliderTile({required this.title});
@override
Widget build(BuildContext context) {
return Container(
child: Text(title)
);
}
}
<块引用>
我也使用过 toString() 方法,但不确定它是否是真正的方法
如果您在 toString()
上使用 String?
,它将返回值(如果有),或者只是 "null"
字符串(如果为空)。
您得到的错误是由 Text
小部件引起的。它知道您将可能包含 null
的内容显示为文本。
UPD:并且请不要遵循以下建议:
<块引用>使用 Text(title!) 而不是 Text(title) – Mehran Ullah
这是一种非常糟糕的做法,破坏了空安全的全部意义。这样做意味着您坚持认为可空类型变量中没有空值,这在大多数情况下是可以避免的,而且不安全,因为如果您没有为变量提供值,可能会导致空值错误,这可能会发生因为您使用的命名参数不是必需的,也没有任何初始值,因此您不能在构造函数中将任何内容传递给您的小部件。
UPD
<块引用>这是推荐的方式吗?因为如果我不希望需要变量怎么办? – 用户4258194
Text
小部件需要一个 String
。这是一个位置参数,这意味着它是必需的。没有文字就不能有 Text widget。
在示例小部件中提供它的选项有哪些?
答案开头部分所示的必需参数;
具有初始值的可选不可为空参数:
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)
);
}
}
一个没有初始值的可为空参数,并且在文本小部件中使用它时进行空检查:
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')
);
}
}
如果您在未提供任何值时需要此文本为空,请在任何提供的选项中使用空字符串作为占位符文本。