An extension on T adds methods callable on values of type T, without subclassing or wrapping.

Program

Play the program to call a custom shout on a plain String.

extensions.dart
extension StringExtras on String {
  String shout() => toUpperCase() + '!';
}

void main() {
  var greeting = 'hello';
  print(greeting.shout());
}
extension `extension Name on T { ... }` adds members to type `T`.
dot call `greeting.shout()` looks like a normal method call.
no subclass Extensions do not require subclassing or wrapping.