prefer-final-in-for-each
Same as prefer_final_in_for_each in Dart lints
- Group
- Style
- Path
lint/style/prefer-final-in-for-each- Default
- On (recommended)
- Origin
- Dart lints
- Rule
- 355 of 512
Prefer final for a for-each loop variable that is never reassigned.
for (var item in items) where item is never written in its scope reads
better as for (final item in items). Destructuring loops are covered when
the top-level record, object, list, or map pattern binds only plain
variables and none of them is reassigned. A loop over an existing variable
(for (item in items)) declares nothing and is ignored. Collection loops
outside function bodies (top-level and field initializers) are also ignored.
for (var name in names) print(name); // flagged
for (final name in names) print(name); // ok
Invalid
class Pair {
final int a;
final int b;
Pair(this.a, this.b);
}
void loops(List<int> numbers, List<(int, String)> rows, List<Pair> pairs, List<List<int>> lists,
List<Map<String, int>> maps) {
for (var n in numbers) {
print(n);
}
for (int n in numbers) {
print(n);
}
for (var (i, s) in rows) {
print('$i$s');
}
for (var Pair(a: x, b: y) in pairs) {
print(x + y);
}
for (var [first, second] in lists) {
print(first + second);
}
for (var {'k': value} in maps) {
print(value);
}
final doubled = [for (var n in numbers) n * 2];
print(doubled);
}
Future<void> streams(Stream<int> values) async {
await for (var v in values) {
print(v);
}
} List<Map<String, int>> maps) { for (var n in numbers) { } for (int n in numbers) { } for (var (i, s) in rows) { } for (var Pair(a: x, b: y) in pairs) { } for (var [first, second] in lists) { } for (var {'k': value} in maps) { } final doubled = [for (var n in numbers) n * 2];Future<void> streams(Stream<int> values) async { await for (var v in values) {Valid
void loops(List<int> numbers, List<(int, String)> rows, List<List<int>> lists) {
for (final n in numbers) {
print(n);
}
for (var n in numbers) {
n += 1;
print(n);
}
for (var n in numbers) {
void bump() {
n++;
}
bump();
}
for (final (i, s) in rows) {
print('$i$s');
}
for (var (i, s) in rows) {
i = 0;
print('$i$s');
}
for (var (i, _) in rows) {
print(i);
}
for (var [first, ...rest] in lists) {
print('$first$rest');
}
var existing = 0;
for (existing in numbers) {
print(existing);
}
for (var i = 0; i < numbers.length; i++) {
print(i);
}
final copy = [for (final n in numbers) n];
print(copy);
}
// The analyzer requires an enclosing function body, not a field initializer.
final topLevelCollection = [for (var n in [1, 2]) n];
class Initializer {
final values = [for (var n in [1, 2]) n];
}Configure prefer-final-in-for-each
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"style": {
"prefer-final-in-for-each": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/style/prefer-final-in-for-each: <reason>More style rules
- prefer-final-locals
prefer_final_localsrecommendedPrefer
finalfor local variable declarations that are never reassigned. - prefer-final-parameters
prefer_final_parametersPrefer
finalfor parameters that are never reassigned. - prefer-first
prefer-firstFlags
[0]index access that should use the.firstgetter. - prefer-for-in
Flags zero-based, unit-step index loops over a syntactically known list.
- prefer-for-loop-in-childrenflutter
Prefers collection-for elements over eager map/toList chains in Flutter children.
- prefer-function-declarations-over-variables
prefer_function_declarations_over_variablesrecommendedFlags a local variable bound to a function literal that should be a local function declaration.
- prefer-generic-function-type-aliases
prefer_generic_function_type_aliasesrecommendedFlags old-style function typedefs written with inline parameter syntax.
- prefer-getter-over-method
Prefer getters for synchronous, zero-argument methods that only read a field.