Optional positional parameters live in [...]. They keep call sites short when the extra value has a natural default, but callers can still pass the value by position when they need different behavior.

Program

Play the program to call one formatter with its default suffix and again with an explicit suffix.

name
optional_positional.dart
Replay: real traced execution (multi-file project)
String label(String name, [String suffix = '!']) {
  return '$name$suffix';
}

void main() {
  var name = 'Ada';
  var normal = label(name);
  var excited = label(name, '!!');
  print('$normal / $excited');
}
String label(String name, [String suffix = '!']) {
  return '$name$suffix';
}

void main() {
  var name = 'Lin';
  var normal = label(name);
  var excited = label(name, '!!');
  print('$normal / $excited');
}
String label(String name, [String suffix = '!']) {
  return '$name$suffix';
}

void main() {
  var name = 'Mina';
  var normal = label(name);
  var excited = label(name, '!!');
  print('$normal / $excited');
}
  1. name ← Ada

    5void main() {6  var name = 'Ada';7  var normal = label(name);
    values this stepAdaname
  2. call ← label(Ada)

    6var name = 'Ada';7var normal = label(name);8var excited = label(name, '!!');
    values this steplabel(Ada)callAdaname
  3. return value ← Ada!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepAda!return valueAdaname!suffix
  4. normal ← Ada!

    6var name = 'Ada';7var normal = label(name);8var excited = label(name, '!!');
    values this stepAda!normal
  5. call ← label(Ada, !!)

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this steplabel(Ada, !!)callAdaname
  6. return value ← Ada!!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepAda!!return valueAdaname!!suffix
  7. excited ← Ada!!

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this stepAda!!excited
  8. print('$normal / $excited');

    8  var excited = label(name, '!!');9  print('$normal / $excited');10}
    outputAda! / Ada!!
    values this stepAda!normalAda!!excited
  1. name ← Lin

    5void main() {6  var name = 'Lin';7  var normal = label(name);
    values this stepLinname
  2. call ← label(Lin)

    6var name = 'Lin';7var normal = label(name);8var excited = label(name, '!!');
    values this steplabel(Lin)callLinname
  3. return value ← Lin!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepLin!return valueLinname!suffix
  4. normal ← Lin!

    6var name = 'Lin';7var normal = label(name);8var excited = label(name, '!!');
    values this stepLin!normal
  5. call ← label(Lin, !!)

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this steplabel(Lin, !!)callLinname
  6. return value ← Lin!!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepLin!!return valueLinname!!suffix
  7. excited ← Lin!!

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this stepLin!!excited
  8. print('$normal / $excited');

    8  var excited = label(name, '!!');9  print('$normal / $excited');10}
    outputLin! / Lin!!
    values this stepLin!normalLin!!excited
  1. name ← Mina

    5void main() {6  var name = 'Mina';7  var normal = label(name);
    values this stepMinaname
  2. call ← label(Mina)

    6var name = 'Mina';7var normal = label(name);8var excited = label(name, '!!');
    values this steplabel(Mina)callMinaname
  3. return value ← Mina!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepMina!return valueMinaname!suffix
  4. normal ← Mina!

    6var name = 'Mina';7var normal = label(name);8var excited = label(name, '!!');
    values this stepMina!normal
  5. call ← label(Mina, !!)

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this steplabel(Mina, !!)callMinaname
  6. return value ← Mina!!

    1String label(String name, [String suffix = '!']) {2  return '$name$suffix';3}
    values this stepMina!!return valueMinaname!!suffix
  7. excited ← Mina!!

    7var normal = label(name);8var excited = label(name, '!!');9print('$normal / $excited');
    values this stepMina!!excited
  8. print('$normal / $excited');

    8  var excited = label(name, '!!');9  print('$normal / $excited');10}
    outputMina! / Mina!!
    values this stepMina!normalMina!!excited
optional positional `[String suffix = '!']` makes the second argument optional while keeping positional call syntax.
default value `label(name)` uses the default suffix because the caller passes only the required `name`.
explicit value `label(name, '!!')` overrides the default by passing the optional argument in the second position.