unnecessary-final
Same as unnecessary_final in Dart lints
- Group
- Style
- Path
lint/style/unnecessary-final- Default
- Off, opt in
- Origin
- Dart lints
- Rule
- 454 of 512
Don't use final for local variables and parameters.
Some codebases prefer var for locals and plain parameters, reserving
final for fields and top-level declarations. This flags the final
keyword on parameters, local variable statements, for-each loop variables
of for statements (including destructuring loops), pattern variable
declarations, and variable patterns (case final x). C-style for
initializers are not variable declaration statements and are left alone;
neither are collection for elements ([for (final x in xs) x]), which the
analyzer does not visit.
Parameters are checked only before Dart 3.13: with primary constructors a
parameter's final declares a field instead.
Local keyword spans come from the syntax tree, not matching words in documentation
or annotation arguments.
void f(final int x) { // flagged
final y = x + 1; // flagged
var z = y; // ok
}
Invalid
// @dart = 3.12
class Pair {
final int a;
Pair(this.a);
}
void params(final int x, {final String? name}) {
final y = x + 1;
final int z = y;
print('$z$name');
}
void loops(List<int> numbers, List<(int, int)> rows) {
for (final n in numbers) {
print(n);
}
for (final (a, b) in rows) {
print(a + b);
}
final (c, d) = rows.first;
print(c + d);
}
void cases(Object o) {
if (o case final int value) {
print(value);
}
switch (o) {
case Pair(a: final first):
print(first);
}
final handler = (final int v) => v;
print(handler);
}
void functionTyped(List<void Function(String message)> listeners) {
for (final void Function(String message) listener in listeners) {
listener('x');
}
} void params(final int x, {final String? name}) { void params(final int x, {final String? name}) {void params(final int x, {final String? name}) { final y = x + 1; final y = x + 1; final int z = y;void loops(List<int> numbers, List<(int, int)> rows) { for (final n in numbers) { } for (final (a, b) in rows) { } final (c, d) = rows.first;void cases(Object o) { if (o case final int value) { switch (o) { case Pair(a: final first): } final handler = (final int v) => v; } final handler = (final int v) => v;void functionTyped(List<void Function(String message)> listeners) { for (final void Function(String message) listener in listeners) {Valid
final int topLevel = 1;
class Holder {
final int value;
static final Holder empty = Holder(0);
Holder(this.value);
}
void params(int x, {String? name}) {
var y = x + 1;
int z = y;
const w = 3;
print('$z$name$w');
}
void loops(List<int> numbers, List<(int, int)> rows) {
for (var n in numbers) {
print(n);
}
for (var (a, b) in rows) {
print(a + b);
}
var (c, d) = rows.first;
print(c + d);
for (final int i = 0; i < 1;) {
print(i);
break;
}
}
void cases(Object o) {
if (o case int value) {
print(value);
}
switch (o) {
case var other:
print(other);
}
}
// Collection `for` elements are not `for` statements; the analyzer skips them.
List<int> elements(List<int> numbers, List<(int, int)> rows) => [
for (final n in numbers) n,
for (final int m in numbers) m,
for (final (a, b) in rows) a + b,
];Configure unnecessary-final
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"style": {
"unnecessary-final": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/style/unnecessary-final: <reason>More style rules
- unnecessary-late
unnecessary_laterecommendedFlags a redundant
latemodifier on an initialized static or top-level variable. - unnecessary-library-directive
unnecessary_library_directiverecommendedFlags a
librarydirective that has neither a doc comment nor annotations. - unnecessary-library-name
unnecessary_library_namerecommendedFlags a
librarydirective that carries an explicit name. - unnecessary-new
unnecessary_newrecommendedFlags an explicit
newkeyword in an instance-creation expression. - unnecessary-null-aware-operator-on-extension-on-nullable
unnecessary_null_aware_operator_on_extension_on_nullableFlags a null-aware access whose member comes from an extension on a nullable type.
- unnecessary-null-checks
unnecessary_null_checksFlags a null assertion
!on a value that flows into a nullable context. - unnecessary-nullable-for-final-variable-declarations
unnecessary_nullable_for_final_variable_declarationsrecommendedFlags a
finalorconstvariable given a nullable type but initialized to a provably non-null value. - unnecessary-parenthesis
unnecessary_parenthesisrecommendedFlags parentheses that can be removed without changing the meaning or hurting readability.