错误:(参数类型“String?”无法分配给参数类型“String”,因为“String?”可为空,而“String”不可,)在Flutter中

bxjv4tth  于 2023-03-19  发布在  Flutter
关注(0)|答案(6)|浏览(346)

我是新来的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),
        ),
      ],
    ),
  ));
}
92vpleto

92vpleto1#

我也有同样的问题
在我的例子中,我不得不使用零安全。

final String? name

我不得不用一个**!**标记来使它工作。比如:如果我想称之为

index.name!
txu3uszq

txu3uszq2#

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

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

有关详细信息,请参阅此Link

krcsximq

krcsximq3#

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.如果你知道只有当text为非空值时才调用errorSnackBar,那么试着改变它的类型:

void errorSnackBar(BuildContext context, String text) {
  // rest of the method the same
}
ylamdve6

ylamdve64#

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

hyrbngr75#

我刚接触Flutter时就遇到过这个问题,最好的办法是使用默认值而不是null,这样如果你得到的是null而不是文本,你就可以使用一些值。

Text? text;
text = somethingComingFromResponseOrServer();
errorSnackBar(context,text);

现在,假设您已将此文本传递给snackbar,并且值为null,我们现在可以使用dart的null检查操作符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'),
        ),
      ],
    ),
  ));
}
iugsix8n

iugsix8n6#

我喜欢的更好的选择是:

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'),
        ),
      ],
    ),
  ));
}

相关问题