[英]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()
将不会运行?
正确的。 如果findNbr
是null
,那么findNbr!
将抛出运行时异常。 那会很糟糕,特别是因为checkItem
的 function 签名广告findNbr
被允许为null
,因此它会违反调用者的期望。
还是应该是一个
?
反而? findNbr?.replaceAll() 编辑:我刚刚注意到我不能使用 findNbr?,它告诉 String? 不能分配参数字符串。
您不能使用findNbr?.replaceAll(...)
因为如果findNbr
是null
,那么它将调用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.