Dartではnullである可能性がある変数を扱う時に便利な演算子が用意されています。
一つ目は??=演算子です。
変数の現在の値がnullの時に代入を行います。変数の現在の値がnullでない時は代入が行われません。
int a; // <-- 初期化していないのでaの値はnull。 a ??= 3; print(a); // <-- Prints 3. a ??= 5; // <-- aの値は3。つまりaの値はnullではない。なので5は代入されない。 print(a); // <-- Still prints 3.
もう一つのnull-aware演算子は??です。
??演算子は、??演算子の左側の式の値がnullでない場合、左側の式の値を返します。
??演算子の左側の式の値がnullの場合、??演算子の右側の式の値を返します。
print(1 ?? 3); // <-- Prints 1. print(null ?? 12); // <-- Prints 12.
↑1行目は??演算子の左側が1です。つまりnullではありません。ですので??演算子の左側の1が返されます。
2行目は??演算子の左側の式の値がnullです。ですので??演算子の右側の
参考
https://dart.dev/codelabs/dart-cheatsheet#null-aware-operators
nullの可能性があるオブジェクトのプロパティまたはメソッドへのアクセスを保護するには?
、ドット(.
)の前に疑問符()を付けます。
myObject?.someProperty
上記のコードは次と同じ意味です。
(myObject != null) ? myObject.someProperty : null
↑三項演算子。
myObjectの値がnullでない場合myObject.somePropertyを返す。
myObjectの値がnullの場合、nullを返す。ということ。
?.演算子を連鎖させて以下のように書くこともできます。
myObject?.someProperty?.someMethod()
↑myObjectがnullの場合、myObject?.someProperty?.someMethod()はnullを返します。
class MyObject{ int myProperty; MyObject({this.myProperty}); } void main(){ var myObject=null; print("${myObject?.myProperty?.toString()}"); //←null MyObject myObject1=MyObject(); MyObject myObject2=MyObject(myProperty:3); print("${myObject1?.myProperty?.toString()}"); //←null print("${myObject2?.myProperty?.toString()}"); //←3 }
参考
https://dart.dev/codelabs/dart-cheatsheet#conditional-property-access