In Dart, you can use wildcard names, that are names consisting on underscores only: _
, __
, ___
, …
Usually, wildcard names should be used to name the variable/parameter that won’t be directly used but needs to be declared.
For example, as counter in the for-loop:
for (var _ in [1, 2, 3]) doSomething();
or as a field, in the pattern:
void sayHello(Person p) {
switch (p) {
case (name, _):
print('Hello, $name!');
}
}
In Dart 3.6 and below, it is possible to read _
wildcard variables, for example, print(_);
.
However, such behavior has changed in Dart 3.7, making _
variables non-binding and breaking the code, where those variables are
used.
void sayHello(String _) {
print('Hello, $_!'); // Compiler error in Dart 3.7 and above: _ is non-binding
}
To avoid problems during upgrades from Dart 3.6-, it’s recommended to refactor the code, to not use wildcard variables.
What is the potential impact?
Once the breaking change is introduced, you will need to update all the code using wildcard variables or parameters to be able to upgrade to the
latest Dart language versions.