与 Null 安全性混淆

Posted

技术标签:

【中文标题】与 Null 安全性混淆【英文标题】:Confusion with Null safety 【发布时间】:2021-12-14 00:28:18 【问题描述】:

我对 Flutter 很陌生,并且由于 null 安全功能,我从在 Java 或其他语言中运行完美的代码中得到了很多错误。比如这个-

int ? i;
  var icecreamFlavours = ['chocolate', 'vanilla', 'orange'];
  icecreamFlavours.forEach((item) 
    i++; //This is where I get the error
    print('We have the $item flavour');
  );

我的错误信息

Error: Operator '+' cannot be called on 'int?' because it is potentially null.

i++;

Error: A value of type 'num' can't be assigned to a variable of type 'int?'.

i++;

【问题讨论】:

i++ 在循环的第一次迭代中应该做什么?使i 不可为空并首先对其进行初始化:int i = 0; 【参考方案1】:

您不能对可空变量执行i++i+=1,因为原因很简单,空变量可以有空值,这将使增量毫无意义。

除此之外,即使您确定i 不为空,您甚至不能执行i!++i!+=1。这个https://github.com/dart-lang/language/issues/1113 有一个未解决的问题

所以现在你可以这样做i = i! + 1

更新: 要使i = i! + 1 工作,您需要确保i 不为空。所以最好在使用之前初始化/分配i 一些值。

【讨论】:

i = i! + 1 不起作用,因为i 从未初始化为非空值,因此它会在第一次迭代时抛出异常。在这种情况下,更好的解决方法是将 i 初始化为非空值。 @jamesdlin 感谢您的意见。答案已更新。

以上是关于与 Null 安全性混淆的主要内容,如果未能解决你的问题,请参考以下文章

Android安全攻防战,反编译与混淆技术完全解析(上)

java代码混淆

御安全浅析安卓开发代码混淆技术

混淆 Laravel 护照 API 安全性的工作原理

Android 应用安全风险与防范

免流高级混淆用啥软件