Differentiate between named parameters and positional parameters in Flutter
#dart#parameters#functions
Answer
Overview
Dart supports two ways to pass arguments to functions: positional parameters (order-based) and named parameters (name-based). Both can be required or optional.
Positional Parameters
Arguments are matched by their position/order.
dart// Required positional String greet(String firstName, String lastName) { return 'Hello, $firstName $lastName!'; } // Must pass in order greet('Alice', 'Smith'); // 'Hello, Alice Smith!' // greet('Smith', 'Alice'); // Also works but semantically wrong // Optional positional -- use [] String greet2(String name, [String greeting = 'Hello']) { return '$greeting, $name!'; } greet2('Alice'); // 'Hello, Alice!' greet2('Alice', 'Hi'); // 'Hi, Alice!'
Named Parameters
Arguments are matched by their name -- order doesn't matter.
dart// Named parameters -- use {} void createUser({required String name, required String email, int age = 0}) { print('User: $name ($email), Age: $age'); } // Call with names -- order doesn't matter createUser(name: 'Alice', email: 'alice@example.com'); createUser(email: 'bob@example.com', name: 'Bob', age: 28); // Different order -- fine! createUser(name: 'Carol', email: 'c@c.com'); // age uses default (0)
Named Parameters in Widgets (Flutter)
Flutter widgets almost always use named parameters:
dart// All Flutter widgets use named parameters Text( 'Hello World', // positional (the text string) style: TextStyle(fontSize: 18), // named textAlign: TextAlign.center, // named maxLines: 2, // named ); Container( width: 200, // named height: 100, // named color: Colors.blue, // named child: Text('Inside'), // named ); ElevatedButton( onPressed: () => print('clicked'), // named -- required child: Text('Click me'), // named -- required );
Key Differences
| Feature | Positional | Named |
|---|---|---|
| Syntax | No label | text |
| Order | Required (position matters) | Any order |
| Optional | text | text |
| Required | Default | text |
| Readability | Less (for many params) | Better (self-documenting) |
| Flutter usage | Rare (first arg) | Almost always |
Mixed Example
dart// First arg positional, rest named void log(String message, {String level = 'INFO', bool timestamp = true}) { final time = timestamp ? DateTime.now().toString() : ''; print('[$level] $time $message'); } log('Server started'); // positional + defaults log('Error!', level: 'ERROR'); // positional + named log('Debug', level: 'DEBUG', timestamp: false);
Flutter Best Practice: Use named parameters for functions with 2+ parameters -- they make call sites self-documenting and prevent ordering mistakes.