【问题标题】:How to tell Flutter that a variable can be null in the right way (Null Safety)?如何以正确的方式告诉 Flutter 变量可以为 null(Null Safety)?
【发布时间】:2021-08-20 12:16:30
【问题描述】:

我有一个关于 Flutter 和 Null 安全性的问题。

例如我有这行代码:

  Future<dynamic> isLoggedIn() async {
    Account account = Account(client);
    Response? result = await account.get();
    if (result == null) {
      print(true);
    }
  }

我已经用Response? 将result 标记为可空变量。所以result 可以为空。如果我检查 result == null,为什么 Visual Studio 会给我警告 The operand can't be null, so the condition is always false.?

我是否误解了 Null Safety 的概念? :-)

【问题讨论】:

  • account.get() 返回什么类型?
  • 一般来说它是一个对象。
  • 如果account.get() 不能返回null,那么将result 标记为可空是没有意义的,因为它永远不可能是null。
  • 是的。那讲得通。但是请求可以从服务器端返回 null 。所以我可以得到 null 作为结果。这就是问题所在:-)

标签: flutter dart dart-null-safety


【解决方案1】:

正如 julemand101 所建议的那样,您的 ide 的行为是由于这样一个事实,即当使用返回不可为空类型的方法设置变量时,dart 分析器可以肯定地知道该变量不为空 (尽管您声明变量的类型允许为空)。

我也对警告有点惊讶,因为如果您通过指定变量的类型来声明变量,而不是使用 var,我希望 dart 分析器能够理解开发人员的意图是防止可能变化。然后想了想,如果方法改变了签名,返回了一个可以为空的类型,编译器会强制开发者进行空检查,所以实际上没有理由在真正需要之前进行这样的检查.

但是,您可以使用注释 // ignore: unnecessary_null_comparison 或通过文件 analysis_options.yaml 使警告消失:

analyzer:
  errors:
    unnecessary_null_comparison: ignore

编辑:

请求可以从服务器端返回 null。

如果您的 account.get() 方法可以返回 null,则 ide 不会向您报告该警告。所以我猜这是你方法的签名不正确。

但是,至于标题中的问题(“告诉 Flutter 变量可以为 null 的正确方法”),通过将变量声明为可为空,您可以选择使用 null 或重新评估变量具有可为空的类型(在这种情况下,空检查是有意义的)。

【讨论】:

    【解决方案2】:

    Visual Studio 向您发出警告是因为(我猜是因为我没有看到您的 get 方法)您的 get 方法返回的值不能为空值

    Future<Response> get() async {
      ...
    }
    

    如果你希望它能够返回 null 它应该这样声明

    Future<Response?> get() async {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 2021-04-13
      • 2021-11-25
      • 2021-03-25
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多