Dart Optional Parameters

Making function parameters flexible and user-friendly

🔧 What are Optional Parameters?

Optional parameters in Dart allow functions to be called with or without certain arguments. They provide default values and make functions more flexible and easier to use.


// Function with optional parameter
void greet(String name, [String greeting = 'Hello']) {
  print('$greeting, $name!');
}

// Can be called both ways
greet('Alice');           // Uses default greeting
greet('Bob', 'Hi');       // Uses custom greeting
                                    

Output:

Hello, Alice!

Hi, Bob!

Types of Optional Parameters

📋

Positional Optional

Parameters in square brackets []

void show(String msg, [int? count]) {
  print('$msg ${count ?? 1} times');
}
🏷️

Named Optional

Parameters in curly braces {}

void create({String? name, int age = 0}) {
  print('Name: $name, Age: $age');
}

Default Values

Provide fallback values

void connect([String host = 'localhost']) {
  print('Connecting to $host');
}

Nullable Optional

Parameters that can be null

void log(String msg, [String? level]) {
  print('${level ?? 'INFO'}: $msg');
}

🔹 Positional Optional Parameters

Use square brackets [] to make parameters optional by position:

// Function with multiple optional parameters
void displayInfo(String name, [int? age, String? city]) {
  print('Name: $name');
  if (age != null) print('Age: $age');
  if (city != null) print('City: $city');
}

void main() {
  displayInfo('Alice');                    // Only required parameter
  displayInfo('Bob', 25);                  // With age
  displayInfo('Charlie', 30, 'New York');  // All parameters
}

Output:

Name: Alice

Name: Bob
Age: 25

Name: Charlie
Age: 30
City: New York

🔹 Optional Parameters with Default Values

Provide default values for optional parameters:

// Function with default values
String formatMessage(String text, [String prefix = 'INFO', bool uppercase = false]) {
  String result = '$prefix: $text';
  return uppercase ? result.toUpperCase() : result;
}

void main() {
  print(formatMessage('System started'));
  print(formatMessage('Warning occurred', 'WARN'));
  print(formatMessage('Error found', 'ERROR', true));
}

Output:

INFO: System started

WARN: Warning occurred

ERROR: ERROR FOUND

🔹 Practical Example

A real-world example using optional parameters:

// Calculator function with optional operation
double calculate(double a, double b, [String operation = 'add']) {
  switch (operation) {
    case 'add':
      return a + b;
    case 'subtract':
      return a - b;
    case 'multiply':
      return a * b;
    case 'divide':
      return b != 0 ? a / b : 0;
    default:
      return 0;
  }
}

void main() {
  print('5 + 3 = ${calculate(5, 3)}');                    // Default: add
  print('5 - 3 = ${calculate(5, 3, 'subtract')}');       // Subtract
  print('5 * 3 = ${calculate(5, 3, 'multiply')}');       // Multiply
  print('5 / 3 = ${calculate(5, 3, 'divide')}');         // Divide
}

Output:

5 + 3 = 8.0

5 - 3 = 2.0

5 * 3 = 15.0

5 / 3 = 1.6666666666666667

🧠 Test Your Knowledge

How do you define positional optional parameters in Dart?