always-put-required-named-parameters-first

Same as always_put_required_named_parameters_first in Dart lints

Group
Style
Path
lint/style/always-put-required-named-parameters-first
Default
Off, opt in
Origin
Dart lints
Rule
6 of 512

Flags a required named parameter declared after an optional named one.

Callers scanning a signature should see the parameters they must pass first. Within the named parameters of any parameter list — functions, methods, constructors, function literals, function-typed parameters, and Function(...) types — every required (or @required) parameter must precede the optional ones:

void f({int? a, required int b}) {}   // `b` flagged
void g({required int b, int? a}) {}   // fine

Optional named super parameters ({super.key, required this.child}) count as optional parameters like any other.

Invalid

example.dartdart
import 'package:meta/meta.dart';

void f({int? a, required int b}) {}

void g({int a = 0, required int b, required int c}) {}

void legacy({int? a, @required int? b}) {}

class A {
  final int x;
  final int y;

  A({this.x = 0, required this.y});

  void m({bool flag = false, required String name}) {}
}

typedef Callback = void Function({int a, required int b});

void h() {
  void local({int? a, required int b}) {}
  final literal = ({int? a, required int b}) => b;
  local(b: 1);
  literal(b: 2);
}

class Base {
  Base({required int b, int? a});
}

class Sub extends Base {
  // Optional super parameters count as optional parameters.
  Sub({super.a, required super.b});
}

class Widgetish extends Base {
  final int child;
  Widgetish({super.a, required this.child}) : super(b: 0);
}
Required named parameters should be before optional named parameters.
2
3void f({int? a, required int b}) {}
Required named parameters should be before optional named parameters.
4
5void g({int a = 0, required int b, required int c}) {}
Required named parameters should be before optional named parameters.
4
5void g({int a = 0, required int b, required int c}) {}
Required named parameters should be before optional named parameters.
6
7void legacy({int? a, @required int? b}) {}
Required named parameters should be before optional named parameters.
12
13 A({this.x = 0, required this.y});
Required named parameters should be before optional named parameters.
14
15 void m({bool flag = false, required String name}) {}
Required named parameters should be before optional named parameters.
17
18typedef Callback = void Function({int a, required int b});
Required named parameters should be before optional named parameters.
20void h() {
21 void local({int? a, required int b}) {}
Required named parameters should be before optional named parameters.
21 void local({int? a, required int b}) {}
22 final literal = ({int? a, required int b}) => b;
Required named parameters should be before optional named parameters.
32 // Optional super parameters count as optional parameters.
33 Sub({super.a, required super.b});
Required named parameters should be before optional named parameters.
37 final int child;
38 Widgetish({super.a, required this.child}) : super(b: 0);

Valid

example.dartdart
import 'package:meta/meta.dart';

void f({required int b, int? a}) {}

void g(int positional, {required int b, required int c, int a = 0}) {}

void legacy({@required int? b, int? a}) {}

void onlyOptional({int? a, int? b}) {}

class Base {
  Base({required int b, int? a});
}

typedef Callback = void Function({required int b, int a});

void h(void Function({required int a, int? b}) cb) {}

Configure always-put-required-named-parameters-first

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "style": {
        "always-put-required-named-parameters-first": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/style/always-put-required-named-parameters-first: <reason>