Flutter 参数类型';字符串?';can';不能分配给参数类型';字符串';

Flutter 参数类型';字符串?';can';不能分配给参数类型';字符串';,flutter,Flutter,当我将颤振升级到2.0.1时,显示此错误: The argument type 'String?' can't be assigned to the parameter type 'String'. 这是我的代码: enum SubStatus { SUB, UNSUB, } extension ResponseStatusExtension on SubStatus{ static const statusCodes = { SubStatus.SUB: "

当我将颤振升级到2.0.1时,显示此错误:

The argument type 'String?' can't be assigned to the parameter type 'String'.
这是我的代码:

  enum SubStatus {
  SUB,
  UNSUB,
}

extension ResponseStatusExtension on SubStatus{
  static const statusCodes = {
    SubStatus.SUB: "sub",
    SubStatus.UNSUB: "unsub",
  };

  String? get statusCode => statusCodes[this];
}
以下是如何使用它:

字符串url=“/post/sub/source/”+subStatus.statusCode+“/”+channelId

这是错误用户界面:

我该怎么做才能修好它?我试图返回
字符串
,但在枚举代码中告诉我应该返回
字符串?

我该怎么办?

编辑: 在@Christopher Moore发表评论后,我意识到我的错误。所以,我将直接在这里使用他的解决方案,因为它是正确的。 这是因为Dart的新零安全特性

您需要在代码中进行以下更改,它将起作用:

String get statusCode=>statusCodes[this]??“”;
使用新的空安全规则,以下
数据类型?x
,数据类型后面有一个问号,表示值
x
可以为空。但是,如果没有“?”,则表示
数据类型x
,它不能为空

因此,基本上
String
String?
是两种不同的数据类型。这就是为什么会出现错误


您可以了解更多信息。

重新启动分析服务器

添加

这样地

subStatus.statusCode

statusCode
的返回类型更改为
String
,并提供默认值

String get statusCode=>statusCodes[this]??“”;

访问映射时,如果映射中不存在键,则有可能会得到
null
返回值。只需提供一个默认值,即可编译此代码。除非您向枚举中添加了一些内容,而没有向映射中添加值,否则不应使用该默认值。

虽然此答案的前提是正确的,但OP有一个可为空的返回类型是有原因的。在评估
statusCodes
映射时,编译器可能会返回
null
。如果希望返回不可为null的
字符串
,则需要执行null检查并提供默认值。因此,您提供的代码将不会在null-safety下编译。但在这一行,请告诉我返回字符串?=><代码>字符串获取状态代码=>状态代码[此]@Preet Shah是的,我同意@Christophermore。在你们的评论之后,我搜索了一下,找到了这篇帮助我理解枚举扩展的文章。我将进行必要的更改。为什么有必要重新启动分析服务器?可能分析仪中的某些更改在null safetyPerhaps之后出现了一些问题,但如果其他地方存在明显问题,可能会导致静态分析按预期显示错误,则不太可能出现这种情况。您可以尝试强模式,它将更频繁地显示错误