【问题标题】:The operator '>' can't be unconditionally invoked because the receiver can be 'null'不能无条件调用运算符“>”,因为接收者可以为“null”
【发布时间】:2021-08-04 10:28:31
【问题描述】:

我刚刚升级到健全的 null 安全性,但无法使这种情况正常工作。 如何检查可空变量的长度?

虽然错误完全有道理,但如果 event.newPhone 为 null 它无法执行检查,有什么更好的方法建议吗?

我有什么:

if(event is AccountInfoChanged){
 if(event.newPhone?.length > 7){ -----> the issue is on ">" operator
    yield EnableUpdateButton();
  }
}

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    您应该使用局部变量来消除可空性。

    if (event is AccountInfoChanged) {
      var newPhone = event.newPhone;
      if (newPhone != null && newPhone.length > 7) {
        yield EnableUpdateButton();
      }
    }
    

    【讨论】:

      【解决方案2】:

      尝试像(event.newPhone?.length ?? -1) > 7 这样更新条件,这样> 运算符的左侧总是有一个非空值。如果event.newPhone 为空,则左侧值为-1。您可以根据您的应用程序需要更新此值。

      if((event.newPhone?.length ?? -1) > 7){
          yield EnableUpdateButton();
      }
      

      【讨论】:

        【解决方案3】:

        这取决于你的上下文,但简而言之:当even.netPhonenull 时,你必须选择要做什么。

        在某些情况下,Dart 能够自己进行类型提升:这是一个快速的 dartpad 示例(如您所见,不会发生编译时错误):

        void main() {
          int? a;
          
          a = doSomeWork();
          
          if (a == null) {
            print("do something when a is null");
            return;
          }
          if (a.isEven) {
            print("do something even");
          } else if (a.isOdd) {
            print("do something odd");
          }
        }
        
        int? doSomeWork() {
          return 5;  // You can change this to any int? value
        }
        
        

        因此,在您的代码中,您可以执行以下操作:

            var myPhone = event.newPhone;
            if (myPhone == null) {
              print("Do something when there's no phone");
              return;
            }
            if (myPhone.length > 7) {  // No null-aware operators needed
              print("Actions when the phone is not null");
            }
        

        如您所见,return 语句让 Dart 推断类型提升。如果您无法返回(再次取决于您的逻辑),请使用 ! 运算符来帮助它返回。

        重要提示/编辑。正如@jamesdlin 所建议的,这仅适用于局部变量。在我写这篇文章的那一刻,在 github 上有几个 Dart open issues 让 Dart 推断出更多关于不可空性提升的信息。

        【讨论】:

        • 非局部变量不会发生自动类型提升,因此您需要在if (event.newPhone == null) 检查之后使用event.newPhone!.length > 7
        【解决方案4】:

        试试这样:

        if(event is AccountInfoChanged)
          if(event.newPhone != null) 
          //to check if phone is null or not, before performing operations on it
            if(event.newPhone!.length > 7) { --> at this point I had to add ! as it is not null for sure 
            yield EnableUpdateButton();
          }
        
        

        【讨论】:

        • 我也试过了,还是在>上显示错误
        • 如果您始终确定有电话号码,请将! 添加到 newPhone 和长度。
        • @Manas 看看这个answer
        • @HuthaifaMuayyad 问题是电话号码在某些情况下也应该可以为空
        • @Manas 正如@PatrickMahomes 评论所解释的,您需要在检查if(event.newPhone != null) 之后使用event.newPhone!.length > 7 。空检查不会提升非局部变量。
        【解决方案5】:

        在执行空检查后将其强制转换为不可为空的 int

        if(event.newPhone?.length as int >7){//your code}
        

        【讨论】:

        • 显式转换为int 是不合适的,因为使用?. 表示在某些情况下event.newPhone 应该是null,并且转换会导致TypeError在运行时被抛出。
        • 这就是为什么我提到他们只在空检查后才这样做的原因。
        【解决方案6】:

        添加“!”接近长度使其非空条件。

        if(event is AccountInfoChanged){
        if(event.newPhone?.length! > 7){ -----> the issue is on ">" operator
        yield EnableUpdateButton();
         }
        }
        

        【讨论】:

        • 除非.length 返回一个可为空的类型(如果newPhoneStringIterable 则不可能),那么event.newPhone?.length!event.newPhone?.length 相同。即使您的意思是(event.newPhone?.length)!,这仍然是不合适的,因为使用?. 表示在某些情况下event.newPhone 应该是null
        猜你喜欢
        • 2022-01-09
        • 1970-01-01
        • 2021-08-18
        • 2022-01-12
        • 2021-07-03
        • 2021-06-02
        • 2023-03-05
        • 1970-01-01
        • 2022-08-24
        相关资源
        最近更新 更多