繁体   English   中英

object 方法中的 Flutter 空安全条件

[英]Flutter null-safety conditionals in object methods

我只是在我的 Flutter 项目中完成整个零安全模式,不确定有什么区别? ! 在对 object 方法的调用中。

例如,提示是添加一个! 有条件的。 这是我现在的一个例子,我不确定这是否应该是? 或一个! findNbr..replaceAll()

Future checkItem({String? findNbr}) async {
  int? x = int.tryParse(findNbr!.replaceAll('-', ''));

  ...

这是否意味着如果 findNbr 为 null, replaceAll()将不会运行?

还是应该是一个? 反而? findNbr?.replaceAll() 编辑:我刚刚注意到我不能使用 findNbr?,它告诉 String? 不能分配参数字符串。

或者这是否意味着我说它不是 null 并运行它?

供您参考,我还没有接近运行我的应用程序,所以我不知道它是否有效。 但我想我最好在做太多事情之前知道它在做什么。 我仍在转换所有内容,并且有 75-100 个 dart 文件。 老实说,我不确定我是否明白这一切,因为我只是添加? 一切,所以无论如何它都可以为空。

Future checkItem({String? findNbr}) async { int? x = int.tryParse(findNbr.,replaceAll('-'; '')). ...

这是否意味着如果 findNbr 为 null, replaceAll()将不会运行?

正确的。 如果findNbrnull ,那么findNbr! 将抛出运行时异常。 那会很糟糕,特别是因为checkItem的 function 签名广告findNbr被允许为null ,因此它会违反调用者的期望。

还是应该是一个? 反而? findNbr?.replaceAll() 编辑:我刚刚注意到我不能使用 findNbr?,它告诉 String? 不能分配参数字符串。

您不能使用findNbr?.replaceAll(...)因为如果findNbrnull ,那么它将调用int.tryParse(null) ,但不允许int.tryParse采用null参数。

您需要做的是以下之一

  • 使findNbr不再是可选的:

     Future checkItem({required String findNbr}) async { int? x = int.tryParse(findNbr.replaceAll('-', '')); ...
  • 允许findNbr是可选的,但具有非空默认值:

     Future checkItem({String findNbr = ''}) async { int? x = int.tryParse(findNbr.replaceAll('-', '')); ...
  • 允许findNbr是可选的,但明确决定如果它是 null 该怎么做。 例如:

     Future checkItem({String? findNbr}) async { int? x = findNbr == null? null: int.tryParse(findNbr.replaceAll('-', '')); ...

老实说,我不确定我是否明白这一切,因为我只是添加? 一切,所以无论如何它都可以为空。

如果一味加? 到所有类型并添加! 对于所有变量,那么是的,null-safety 将毫无意义:这样做会给您带来与 null-safety 之前的 Dart 相同的行为。

零安全的重点是防止不应该null的东西永远是null 您之前可能已经编写过这样的代码,但没有 null 安全性,这意味着执行运行时null检查(例如assert(x;= null);if (x.= null) {... } ,或依赖于 null-如果在不期望的地方使用了null ,则导致程序崩溃的指针异常)。 空安全性意味着现在可以通过 static 分析在构建时完成此类检查,这意味着可以更早、更完整地发现错误。 此外,虽然以前的函数需要明确记录 arguments 和返回值是否允许为null (并且文档不充分或不正确可能是错误的根源),但现在它们在这方面是自我记录的。 这就像使用int foo(String s)dynamic foo(dynamic s) ; 使用强类型可以更早地捕获错误并更好地描述函数的契约。

如果您还没有这样做,我建议您阅读了解 Null 安全性

我想建议你使用! 运算符,也称为 bang 运算符,尽可能少。 仅当 dart 分析器错误并且您 100% 知道该值never是 null 时,才应使用此运算符。

下面是 dart 分析器出错的示例,您应该使用 bang 运算符。

// We have a class dog with a nullable name.
class Dog {
  String? name;
  
  Dog({this.name});
}

void main() {
  // We create a dog without a name.
  final dog = Dog();
  
  // We assign the dog a name.
  dog.name = 'George';
  
  // The dart analyser will show an error because it can't know if the
  // name of the object is not null.
  //
  // Will throw: `A value of type 'String?' can't be assigned to a
  // variable of type 'String'`.
  String myDogsName = dog.name;

  // To avoid this, you should use the bang operator because you `know` it
  // is not null.
  String myDogsName = dog.name!;
}

? 运算符简单地告诉 Dart 该值can是 null。 所以每次你要放置一个? 操作员,问问自己,这个值可以是 null 吗?

Dart 中的 null 安全功能主要是为了帮助开发人员记住值何时can是 null。 Dart 现在将简单地告诉您何时将变量设为可空以强制 null 检查或默认值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM