如何以正确的方式告诉 Flutter 变量可以为 null(Null Safety)?

How to tell Flutter that a variable can be null in the right way (Null Safety)?

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

例如我有这行代码:

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

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

我是否误解了空安全的概念? :-)

Visual Studio 给你警告是因为(我猜是因为我没有看到你的 get 方法)你的 get 方法是 returning 值,它不能是空值

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

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

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

正如 julemand101 所建议的,您的 ide 的行为是由于以下事实:当使用 return 是 non-nullable 类型的方法设置变量时, dart 分析器肯定知道该变量不为空(尽管您声明该变量的类型允许为空)。

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

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

使警告消失
analyzer:
  errors:
    unnecessary_null_comparison: ignore

编辑:

the request can return null from server side.

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

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