Prefer using '??=' over testing for nullについて(Null-aware Operatorsまとめ)

if (database == null) {
                  database = openDatabase(
                    join(await getDatabasesPath(), 'track_data.db'),
                  );
                }

というコードを書いたらPrefer using '??=' over testing for nullと注意されました。
'??='とはDartのNull-aware Operatorsというものだそうです。
以下、Null-aware Operatorsを紹介します。

??

exp ?? otherExp

とすると、これはexpがnullでない場合expを、expがnullである場合otherExpを返します。

??=

obj ??= value

とすると、objがnullの時objにvalueを代入し、objがnullでない時は代入操作を行いません。

?.
?.はオブジェクトがnullでない時にメソッドやゲッターを呼び出したい時に使用します。

obj?.method()

とすると、objがnullの時はnullを、nullでない時はobj.method()を返します。

obj?.child1?.child2?.getter

とすると、obj,child1,child2のいずれもnullでない時にゲッターを返します。

?...

List lowerNumbers = [1, 2, 3, 4, 5];
List upperNumbers = [6, 7, 8, 9, 10];

この時、

[…lowerNumbers…upperNumbers]==[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

が成り立ちます。
この...をspread operatorといい、collectionリテラル(リストやマップなど)の中でspread operatorを使うとcollectionリテラルの中身を展開し、挿入します。
?...を使うと、対象がnullでないときにのみ挿入を行います。
つまり、

List lowerNumbers = [1, 2, 3, 4, 5];
List upperNumbers = [6, 7, 8, 9, 10];
List numbers = […lowerNumbers?…upperNumbers];

List numbers = [];
numbers.addAll(lowerNumbers);
if(upperNumbers != null){
 numbers.addAll(upperNumbers);
}

は等しいです。

if (database == null) {
                  database = openDatabase(
                    join(await getDatabasesPath(), 'track_data.db'),
                  );
                }

と書くよりも

database = openDatabase(join(await getDatabasesPath(), 'track_data.db'),);

と書く方がいいという話でした。