Closed1
【Dart】Cascade notationのメモ
コードを読んでいて、
voidrunApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app)
..scheduleWarmUpFrame();
}
の「..」がわからなかったので、Dartのlanguage tourを読んでメモ。
Cascade notation
..
、もしくは?..
- 直前に作ったオブジェクト(以下の場合はpaint) に対する処理(関数呼び出しやフィールドへのアクセス)を短く記述できる。
- カスケード記法に続くコードは、返されるかもしれない値を無視して、このオブジェクトを操作します。
- 続く処理は
;
が不要。最後の処理に;
をつける。
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
前述の例は、このコードと同等です。
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
- カスケードの操作対象となるオブジェクトがnullである可能性がある場合、最初の操作にnull-shortingカスケード(
?..
)を使用します。?...で始まることで、カスケードのどの操作もそのNULLオブジェクトに対して行われないことが保証されます。
querySelector('#confirm') // Get an object.
?..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
は以下と同じ
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
- ネストもできる。
ネストするなら()でcascadeされているfunctionとcascade処理を囲む必要があるみたい。
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
- 戻り値がある関数にカスケードしないとエラーになる。
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.
ドキュメント
このスクラップは2021/11/25にクローズされました