Dartの..
や?..
って何?ってよく聞かれるので。
【公式】Cascade notation(カスケード記法)って呼ばれるもの。
カスケード記法
機械翻訳すると、Dartのカスケード記法は以下のように説明されている。
同じオブジェクトに対して一連の操作を行うことができます。関数呼び出しに加えて、同じオブジェクトのフィールドにアクセスすることもできます。これにより、一時変数を作成する手間が省け、より流動的なコードを記述できるようになります。
例えば、
1
2
3
4
| var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
|
をカスケードで書き直すと、
1
2
3
4
| var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
|
とかける。
直前に作ったpaint
オブジェクトに対する関数呼び出しや、フィールドへのアクセスを短く記述できる。
カスケード記法に続くコードは、返されるかもしれない値を無視して、このオブジェクトを操作する。
null-shortingカスケード
カスケードが動作するオブジェクトがnullになる可能性がある場合は、?..
で記述できる。
2.12以降
1
2
3
4
| var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
|
は、
1
2
3
4
| querySelector('#confirm') // Get an object.
?..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
|
と書ける。
注意
戻り値void
の関数にカスケードするとエラーになる。
1
2
3
| var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.
|
この場合、sb.write
の戻り値がvoid
なのでカスケードできない。理屈が分かればなんのこっちゃない。