错误:(参数类型“String?”不能分配给参数类型“String”,因为“String?”是可以为空的,而“String”不是。)在 Flutter 中

问题描述 投票:0回答:6

我是 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),
        ),
      ],
    ),
  ));
}
flutter android-studio dart visual-studio-code flutter-layout
6个回答
11
投票

我有同样的问题

就我而言,我不得不使用空安全。

final String? name

我必须使用 ! 标记才能使其正常工作。比如:如果我想叫它

index.name!

4
投票

这可能会帮助新人, 我有类似的问题,我解决它的方式

 Padding(
      padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
      child: new Text(text ?? 'Default Value'),
    ),

参考这个链接了解更多信息


3
投票

Text()
需要一个
String
作为它的第一个参数(即不是
null
)。
null
不是类型
String
的有效值,就像
123
不是类型
String
的有效值一样。

如果您的错误消息是

String?
,您需要处理它是
null
的情况,然后才能将其传递给
Text()
。一些选项是:

  1. 检查是否为空并提前返回:
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
}
  1. 如果您知道只在
    errorSnackBar
    非空时调用
    text
    ,请尝试更改它的类型:
void errorSnackBar(BuildContext context, String text) {
  // rest of the method the same
}

0
投票

使用 .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()),
            ),
          ],
        ),
      ));
    }

0
投票

我刚接触 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'),
        ),
      ],
    ),
  ));
}


0
投票

我喜欢的更好的选择是:

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'),
        ),
      ],
    ),
  ));
}
© www.soinside.com 2019 - 2024. All rights reserved.