我是 flutter 的新手,在传递字符串时遇到错误并到处查看,最后在 StackOverflow 中添加它
错误是
Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
void errorSnackBar(BuildContext context, String? text) {
ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
duration: new Duration(seconds: 4),
content: new Row(
children: <Widget>[
Icon(
Icons.error,
color: Colors.red,
),
Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
child: new Text(text),
),
],
),
));
}
我有同样的问题
就我而言,我不得不使用空安全。
final String? name
我必须使用 ! 标记才能使其正常工作。比如:如果我想叫它
index.name!
这可能会帮助新人, 我有类似的问题,我解决它的方式
Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
child: new Text(text ?? 'Default Value'),
),
参考这个链接了解更多信息
Text()
需要一个 String
作为它的第一个参数(即不是 null
)。 null
不是类型 String
的有效值,就像 123
不是类型 String
的有效值一样。
如果您的错误消息是
String?
,您需要处理它是null
的情况,然后才能将其传递给Text()
。一些选项是:
void errorSnackBar(BuildContext context, String? text) {
if (text == null) return;
// dart uses "type promotion" to know that text is definitely not null here
final textWidget = Text(text); // this is fine
ScaffoldMessenger.of(context) ... // show snackbar
}
errorSnackBar
非空时调用 text
,请尝试更改它的类型:void errorSnackBar(BuildContext context, String text) {
// rest of the method the same
}
使用 .toString() 将文本转换为字符串
void errorSnackBar(BuildContext context, String? text) {
ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
duration: new Duration(seconds: 4),
content: new Row(
children: <Widget>[
Icon(
Icons.error,
color: Colors.red,
),
Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
child: new Text(text.toString()),
),
],
),
));
}
我刚接触 Flutter 时遇到了这个问题。 最好的办法是使用一些默认值而不是 null,这样如果你得到 null 而不是一些文本,你就可以使用一些值。即
Text? text;
text = somethingComingFromResponseOrServer();
errorSnackBar(context,text);
现在假设您已将此文本传递给 snackbar 并且值为 null 我们可以在此处使用 dart 的空检查运算符
Datatype? variableName;
现在,如果变量没有任何内容或有一些文本,请使用 ??
进行检查。然后给出一些默认值。喜欢variableName ?? 'Hello variable is null so this will be the default value'
void errorSnackBar(BuildContext context, String? text) {
ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
duration: new Duration(seconds: 4),
content: new Row(
children: <Widget>[
Icon(
Icons.error,
color: Colors.red,
),
Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
child: Text(text ?? 'Some Default text to show if text is null'),
),
],
),
));
}
我喜欢的更好的选择是:
void errorSnackBar(BuildContext context, String? text)
{
ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
duration: new Duration(seconds: 4),
content: new Row(
children: <Widget>[
Icon(
Icons.error,
color: Colors.red,
),
Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
child: new Text('$text'),
),
],
),
));
}