发布于 

【Dart】空安全梳理

空安全

Dart和Kotlin一样都是支持空安全,空安全操作符主要有两个:

  • ?可空类型

  • ! 类型断言

可空类型

在之前的介绍中,声明一个变量,如:

1
2
String str = "Mike";
str = null;

这个时候str = null代表会报错,提示A value of type ‘Null’ can’t be assigned to a variable of type ‘String’, 这个是因为str不是一个可空类型。如果要不报错只需这样声明:

1
String? str = "A";

方法也可以实现可空返回类型:

1
2
3
4
5
6
String? getData(data) {
if(data != null){
return "this is server data";
}
return null;
}

!非空类型断言

1
2
3
4
5
String? str = "this is Dart";
str=null;

// ! 表示如果str不等于null 会打印str的长度
print(str!.length);

late关键字

late关键字主要用于延迟初始化,在声明对象的时候可以不赋初始值:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person {
late String name;
late int age;

void setName(String name, int age) {
this.name = name;
this.age = age;
}

String getName() {
return name;
}
}

required关键词

required关键词是用来允许根据需要标记任何命名参数(函数或类),使得它们不为空。因为可选参数中必须有个required参数或者该参数有个默认值。

在之前介绍Dart命名参数的方法时候有这样的一个方法:

1
2
3
4
5
6
7
8
9
10
String getUserInfo(String username, {int age = 0, String sex = '男'}) { //形参
if (age != 0) {
return "姓名:$username -> 性别:$sex -> 年龄:$age";
}
return "姓名:$username -> 性别:$sex -> 年龄保密";
}

getUserInfo("Mike");

print(getUserInfo('Mike', sex: '男', age: 22));

后面两个参数是可选的,如果使用required关键词修饰age和sex,那我getUserInfo(“Mike”)机会报错,你必须要传:

1
2
3
4
5
6
7
8
9
String getUserInfo(String username, {required int age, required String sex}) { //形参
if (age != 0) {
return "姓名:$username -> 性别:$sex -> 年龄:$age";
}
return "姓名:$username -> 性别:$sex -> 年龄保密";
}

// 调用
getUserInfo('Mike', sex: '男', age: 22)

required关键词可以在类的构造方法里使用,这样可以限定了一些初始化必须的操作:

1
2
3
4
5
6
class Person {
String? name;
int age;
// 表示 name 和age 必须传入
Person({this.name, required this.age});
}