With Dart, you can write functions with unnamed (the old way), named, and unnamed optional parameters. In Flutter, unnamed optional parameters are the most common style you will be using, especially with widgets (more on this in the following chapters).
Named parameters can also remove ambiguity from what each parameter is supposed to do. Take a look at the following line from the preceding code example:
unnamed('Huxley', 3);
Now, compare it with this line:
duplicate('Mikey', times: 3);
In the first example, it isn't immediately clear what the purpose of each parameter is. In the second example, the times parameter immediately tells you that the text Mikey will be duplicated three times. This can go a long way with functions that have rather long parameter lists, where it can be difficult to remember the expected order of the parameters. Take a look at how this syntax is put to work in the Flutter framework:
Container(
margin: const EdgeInsets.all(10.0),
color: Colors.red,
height: 48.0,
child: Text('Named parameters are great!'),
)
This isn't even all the properties that are available for containers – it can get much longer. Without named parameters, this sort of syntax could be almost impossible to read.
You can completely omit it if you are so inclined. However, for any parameter or even function name that does not have type annotation, Dart will assume that it is of the dynamic type. Since we would like to exploit Dart's type system for all it's worth, dynamic types should be avoided. That is why we always strive to add the void keyword in front of any function that doesn't return a value.