Las funciones en los lenguajes de programación son un grupo de sentencias que dato unos parámetros devuelve un resultado de cierto tipo o incluso sin retorno como los void.
Funciones en Dart
Las funciones en Dart son objetos que se pueden asignar a variables, enviar como parámetros y como resultado, Dart también admite funciones anónimas y funciones de flecha.
Dart es un lenguaje orientado a objetos, como dijimos inicialmente las funciones también son objetos que se identifican por el tipo Function.
bool isEvenOrOddNumber(num number) {
return number % 2 == 0;
}
void main() {
// validar si un número es par o impar
int number = 3;
var evenNumber = isEvenOrOddNumber(number);
print(evenNumber ? 'Es par' : 'Es impar');
}
Aunque Dart siempre recomienda las funciones de tipo, si quitamos el tipo de retorno sigue funcionando y siendo una función.
isEvenOrOddNumber(num number) {
return number % 2 == 0;
}
Para el tipo de funciones como los ejemplos que vimos anteriormente, se puede abreviar como una función de flecha con la siguiente estructura: <tipe name() => print(‘nombre’);>.
// Abreviar la función anterior
bool isEvenOrOddNumber(num number) => number % 2 == 0;
Parámetros
Una función puede tener cualquier número de parámetros obligatorios, también puede tener opcionales y con nombre.
int add({required int number1, required int number2}) => number1 + number2;
int add2(int number1, {int? number2}) => number1;
int add3(int number1, int number2) => number1 + number2;
Parámetros con nombre
Los parámetros con nombre son opcionales a menos que se indique que serán obligatorios con la palabra clave required. En caso de no marcarlos como required, entonces se debe colocar opcionales con <?> después del tipo de dato.
void main() {
var res = addOptional(num1: 1, num2: 3);
print(res); // 4
}
/// Suma con parámetros opcionales
int addOptional({int? num1, int? num2}) {
if (num1 == null || num2 == null) return 0;
return num1 + num2;
}
También se pueden definir valores por defecto.
void main() {
var res = addOptional(num1: 1, num2: 3);
print(res); // 4
}
/// Suma con parámetros con valores por defecto
int addOptional({int num1 = 0, int num2 = 0}) {
return num1 + num2;
}
Y como habíamos visto antes, tenemos los obligatorios con required.
void main() {
var res = addRequired(num1: 1, num2: 3);
print(res); // 4
}
/// Suma con parámetros obligatorios
int addRequired({ required int num1, required int num2}) => num1 + num2;
Parámetros posicionales opcionales
Cuando veamos parámetros dentro de [], es porque son parámetros posicionales opcionales sino se agrega un valor por defecto se debe anotar como opcional con ?.
void main() {
var res = buildMessage(
'Bob', 'Pep', 'Este es un mensaje de agradecimiento.', 'Colombia');
print(res);
}
String buildMessage(String from, String to, String msg, [String? postal]) {
var result = '''
Buen día $to
$msg
Cordial saludo $from
''';
if (postal != null) {
result = '${result}Enviado desde $postal';
}
return result;
}
Función main()
Todas las aplicaciones en Dart deben tener una función main() superior, que es donde arranca la aplicación, devuelve void y tiene como parámetros opcional List<String> para los argumentos. Ya hemos visto algunos ejemplos de esta función anteriormente.
// ejemplo básico
void main() {
print('Hola Mundo!');
}
// ejecutar app con el comando:
// dart args.dart 1 test
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}
Funciones como objetos de primera clase
Esto se refiere a la forma de poder pasar una función dentro de otra función.
int addElement(int element) {
return element + element;
}
void main() {
var list = [1, 2, 3];
// pasamos la función addElement como parámetro.
var newList = list.map(addElement);
print(newList); // (2, 4, 6)
}
Funciones anónimas
La mayoría de las funciones tienen nombre como las que hemos visto durante nuestro aprendizaje sobre funciones, pero también podemos crear funciones sin nombre llamadas funciones anónimas o lambdas.
void main() {
// imprimimos la cantidad de letras que tiene cada color
const colors = ['red', 'blue', 'green'];
colors.map((color) {
return color.toUpperCase();
}).forEach((color) {
print('$color: ${color.length}');
});
}
Para aprender más sobre funciones en Dart, podemos acceder a la documentación oficial, donde hay más detalle al respecto.
Conclusión
Para finalizar, vimos los diferentes tipos de funciones que usa Dart y algunas formas de aplicarlas en nuestras aplicaciones, esto nos ayudará mucho cuando estemos trabajando con Flutter.
Siguientes pasos
En la siguiente publicación aprenderemos un poco sobre las declaraciones o sentencias de control en Dart.