Dart-理解空安全中的的操作符

简介: Dart-理解空安全中的的操作符

Dart从2.12开始,支持健全的空安全机制。

在Dart、Flutter中开启空安全后,代码中所有的类型默认都会是非空类型的,它们的值都不能为空,也就是代码中的null。除非使用?声明为可空。

有了空安全,原本处于运行时的空值引用错误将变为编译时的分析错误,这样的好处是将程序运行时才会出现的空指针异常提供在编译基暴露出来。

为了方便理解,我先定义一个class

class Person {
  Children children;
  work() {
    print("人在工作");
  }

  toString() {
    return "这是一个人";
  }
}

class Children {
  eat() {
    print("孩子吃饭啦");
  }
}

声明可空类型

在声明变量的类型后加上?操作符,就代表变量是可空的。

void main() {
  Person? p;
}

避空操作符?

如果我们无法知道某个可空变量在运行时是否为空,但是我们需要调用变量的方法或属性,为了代码的健壮性,我们可以使用?操作符。

Person? p;
p.work();

像这样写后,dart编译器会直接给出错误提示,因为被调用方法的对象可能为null。

我们只需要在调用时加上?来避免空操作。

void main() {
  Person? p;
  /// 跳过运行
  p.work();
  print("程序结束");
}

打印结果: 程序结束。

因为p是一个Null对象,所以p.work()不会运行,直接跳过。

空值断言操作符!

空安全下,以下代码会在error.toUpperCase()一个编译错误。

class HttpResponse {
  final int code;
  final String? error;

  HttpResponse.ok()
      : code = 200,
        error = null;
  HttpResponse.notFound()
      : code = 404,
        error = 'Not found';

  @override
  String toString() {
    if (code == 200) return 'OK';
    return 'ERROR $code ${error.toUpperCase()}';
  }
}

但是我们人为地可以观察出,在code不等于200的时候,error是肯定不为null的,但是编译器并不知道code和error之间的联系。

这时候空值断言操作符!就能派上用场了。

一个作为后缀的感叹号标记 (!) 会让左侧的表达式转换成其对应的非空类型。

String toString() {
  if (code == 200) return 'OK';
  return 'ERROR $code ${error!.toUpperCase()}';
}

加上!会告诉编译器,在!的左侧的变量肯定是不为空的,这样就可以正常通过编译了。

相关文章
|
存储 Dart
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
Dart中的运算符提供对数据操作和处理的能力,其中的算术运算符、逻辑运算符非常符合现实中的使用情况,其他不同的运算符则有着自己的操作逻辑...
625 0
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
|
5月前
|
Dart
Dart之类型转换
Dart之类型转换
N..
|
6月前
|
Dart
Dart语言中的条件表达式和运算符
Dart语言中的条件表达式和运算符
N..
76 0
|
6月前
|
Dart JavaScript 前端开发
dart语言中的常量与变量
dart语言中的常量与变量
58 0
|
6月前
|
Dart
Dart 运算符重载,详细介绍
Dart 运算符重载,详细介绍 Dart 支持运算符重载,它允许我们重载内置的运算符以执行自定义操作。在 Dart 中,我们可以通过实现一些特定的方法来重载运算符。
|
存储 Dart JavaScript
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
166 0
|
Dart JavaScript 前端开发
Dart 条件语句
Dart 条件语句 在 Dart if 语句中,if-else 语句和 if-else-if 语句用于实现基于一个或多个布尔表达式的语句的条件执行。 在本教程中,我们将学习 Dart If 语句、Dart If-Else 语句和 Dart If-Else-If 梯形语句的语法和用法。
223 0
|
Dart JavaScript 前端开发
dart 语言中的 常量 与 变量
本文介绍 dart 语言中的 常量 与 变量
92 0
|
Dart
Dart 之 操作符
Dart 之 操作符
66 0
Dart 之 操作符