← → or space · progress saves for Continue on the roadmap

Goal

Return multiple related values from a function without creating a class.

Step 1 - Positional record

(int, String) getStatus() {
  return (200, 'OK');
}

void main() {
  var result = getStatus();
  print(result.$1); // 200
  print(result.$2); // OK
}
  • Positional record values are accessed with $1, $2, etc.

Step 2 - Named record

({int code, String message}) getStatusNamed() {
  return (code: 200, message: 'Success');
}

void main() {
  var result = getStatusNamed();
  print(result.code);
  print(result.message);
}
  • Named records are clearer for readability.

Step 3 - Destructuring

(int, int) minMax(List<int> nums) {
  int min = nums.reduce((a, b) => a < b ? a : b);
  int max = nums.reduce((a, b) => a > b ? a : b);
  return (min, max);
}

void main() {
  var (smallest, largest) = minMax([4, 8, 1, 9]);
  print('min: $smallest, max: $largest');
}
  • Destructuring unpacks record values into variables.

When to use records

  • Good for small helper returns (min/max, code/message).
  • For big data models, use a class instead.

Practice tasks

  • Return (firstName, lastName) from a function.
  • Return named record ({double min, double max, double avg}).
  • Destructure and print each value.