??是判断前者是否为null,如果是null就取后者,否则取前者
var a = null;
var b = 'b';
print(a ?? b); // b
?.是避空运算符,如果前者为null,后面的代码就会被跳过,也就不会报错
var a;
print(a.length); // 会报错,因为a有可能为null
print(a?.length); //不会报错,如果a是null,就跳过本行后面的代码
??=是如果左边为null,就从右边赋值,反之不赋值
var a = null;
var b = "b";
var c = "c";
print(a ??= b) // b
print(b ??= c) //c
?[]是判断索引处的值是否为null,如果是null就跳过后面部分,就不会报错
var a = new List<int>;
a[1] = 2;
print(a?[2]); //不会报错,如果不加?就会报错
?是将类型声明为可空类型
String? a; //可空类型允许不赋值(值为null),不会报错
String a = "a"; //不加? 为非空类型,一定要赋值,否则报错
!是将类型声明为非空类型
var map = {'key': 'value'};
print(map['key']!.length); // 加 ! 不会报错,不加就会报错