Closed1

【Dart】Cascade notationのメモ

Ryouhei FurugenRyouhei Furugen

コードを読んでいて、

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'.

ドキュメント

https://dart.dev/guides/language/language-tour#cascade-notation

このスクラップは2021/11/25にクローズされました