prefer-for-in
- Group
- Style
- Path
lint/style/prefer-for-in- Default
- Off, opt in
- Origin
- Falcon
- Rule
- 360 of 512
Flags zero-based, unit-step index loops over a syntactically known list.
A for-in loop expresses element traversal directly; use .indexed when the
index is also needed. Matches a single local initialized to 0, a strict
index < items.length bound, and index++, ++index, or index += 1.
The collection must be a local or parameter explicitly typed List, or a
local with an inferred type initialized with a list literal. Other types,
fields, and computed receivers are skipped because syntax alone cannot
establish iterability.
Files with unprefixed imports, library parts, or a possible local declaration
shadowing List are skipped rather than guessing the collection's identity.
Body writes to the index, collection rebinding, element writes, collection
escapes or method calls, closures, cascades, and suspension are excluded.
Collection references in the body must be direct items[index] reads.
Collection and index references must resolve to the original declarations;
shadowed bindings cannot stand in for either loop variable.
This is a syntactic recommendation, not an automatic rewrite: indirect
mutation through aliases or opaque function calls is not analyzed.
Invalid
void canonical(List<int> items) {
for (var i = 0; i < items.length; i++) {
print(items[i]);
}
for (int index = 0; index < items.length; ++index) {
print(items[index]);
}
for (var i = 0; i < items.length; i += 1) {
print('$i: ${items[i]}');
}
for (var i = (0); (i) < (items.length); i++)
print(items[i]);
for (var i = 0; i < items.length; i++) {
if (items[i] < 0) continue;
if (items[i] == 10) break;
print(i);
}
}
void literals() {
final values = [1, 2, 3];
for (var j = 0; j < values.length; j++) {
print(values[j]);
}
List<String> names = ['Ada', 'Grace'];
for (var n = 0; n < names.length; n += 1) {
print(names[n]);
}
}void canonical(List<int> items) { for (var i = 0; i < items.length; i++) { } for (int index = 0; index < items.length; ++index) { } for (var i = 0; i < items.length; i += 1) { } for (var i = (0); (i) < (items.length); i++) print(items[i]); for (var i = 0; i < items.length; i++) { final values = [1, 2, 3]; for (var j = 0; j < values.length; j++) { List<String> names = ['Ada', 'Grace']; for (var n = 0; n < names.length; n += 1) {Valid
void boundaries(List<int> items, List<int> other) {
for (final item in items) {
print(item);
}
for (var i = 1; i < items.length; i++) {
print(items[i]);
}
for (var i = 0; items.length > i; i++) {
print(items[i]);
}
for (var i = 0; i <= items.length; i++) {
print(i);
}
for (var i = 0; i < items.length; i += 2) {
print(items[i]);
}
for (var i = 0; i < items.length; i--) {
print(items[i]);
break;
}
for (var i = 0; i < items.length; i++) {
i += 1;
print(items[i]);
}
for (var i = 0; i < items.length; i++) {
items.add(i);
}
for (var i = 0; i < items.length; i++) {
items[i] = 0;
}
for (var i = 0; i < items.length; i++) {
items = other;
}
for (var i = 0; i < items.length; i++) {
print(items[i + 1]);
}
for (var i = 0; i < items.length; i++) {
print(items);
}
for (var i = 0, j = 0; i < items.length; i++, j++) {
print(items[i]);
}
var index = 0;
for (index = 0; index < items.length; index++) {
print(items[index]);
}
for (var i = 0; i < items.length; i++) {
final callback = () => items[i];
print(callback);
}
for (var i = 0; i < items.length; i++) {
final alias = items;
alias.clear();
}
for (var i = 0; i < items.length; i++) {
final i = 1;
print(items[i]);
}
for (var i = 0; i < items.length; i++) {
(i, index) = (1, 2);
}
}
void nonLists(String text, Map<int, int> entries, dynamic unknown) {
for (var i = 0; i < text.length; i++) {
print(text[i]);
}
for (var i = 0; i < entries.length; i++) {
print(entries[i]);
}
for (var i = 0; i < unknown.length; i++) {
print(unknown[i]);
}
}
class Owner {
List<int> items = [1, 2];
void fields() {
for (var i = 0; i < items.length; i++) {
print(items[i]);
}
for (var i = 0; i < this.items.length; i++) {
print(this.items[i]);
}
}
}
Future<void> suspension(List<int> items) async {
for (var i = 0; i < items.length; i++) {
await Future<void>.value();
print(items[i]);
}
}Configure prefer-for-in
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"style": {
"prefer-for-in": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/style/prefer-for-in: <reason>More style rules
- 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.
- prefer-initializing-formals
prefer_initializing_formalsrecommendedPrefer initializing formals when a parameter is copied directly into its field.
- prefer-inlined-adds
prefer_inlined_addsrecommendedFlags an
addcascade on a list literal whose element could be written inline. - prefer-int-literals
prefer_int_literalsFlags a whole-number double literal, such as
1.0, where the context type isdoubleso the int literal1means the same value. - prefer-interpolation-to-compose-strings
prefer_interpolation_to_compose_stringsrecommendedPrefers string interpolation to composing strings with
+.