Functions
9.1 Defining Functions
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) => a * b; // arrow syntax for single expressions
void log(String message) => print('[LOG] $message');
bool isEven(int n) => n % 2 == 0;9.2 Parameters
// Optional positional parameters: [ ]
String greet(String name, [String greeting = 'Hello', String? suffix]) =>
'$greeting, $name${suffix ?? ''}';
greet('Ana');
greet('Ana', 'Hi', '!');
// Named parameters: { } (optional by default; use `required` or defaults)
void createUser({required String name, int age = 18, String? email}) {}
createUser(name: 'Bo', email: 'bo@x.com');
// Named arguments can appear anywhere in the argument list (Dart 2.17+)
void connect(String host, {int port = 80}) {}
connect(port: 8080, 'localhost');9.3 First-Class Functions, Closures and Tear-offs
int square(int x) => x * x;
int Function(int) op = square; // function type
var fn = (int x) => x + 1; // anonymous function (lambda)
[1, 2, 3].map(square); // tear-off: pass the function itself
['a', 'b'].forEach(print);
var parse = int.parse; // static method tear-off
var toUpper = 'x'.toUpperCase; // instance method tear-off
var makeList = List<int>.empty; // constructor tear-off (Dart 2.15)
Function makeCounter() {
var count = 0;
return () => ++count; // closure captures count
}
final counter = makeCounter();
counter(); counter(); // 1, 2
int Function(int) makeMultiplier(int factor) => (x) => x * factor;
final triple = makeMultiplier(3);
print(triple(5)); // 159.4 Typedefs
typedef Predicate<T> = bool Function(T value);
typedef Json = Map<String, dynamic>; // type alias for any type (Dart 2.13+)
typedef IntList = List<int>;
List<T> filter<T>(List<T> items, Predicate<T> test) => [for (final i in items) if (test(i)) i];
filter([1, 2, 3, 4], (n) => n.isEven);9.5 The main Function and Return Types
void main(), void main(List<String> args), or Future<void> main() async.
Functions without a return statement return null. Declare the return type void (or Never for always-throwing functions).