prefer-named-boolean-parameters

Group
Style
Path
lint/style/prefer-named-boolean-parameters
Default
Off, opt in
Origin
Falcon
Rule
389 of 512

Flags explicit positional bool parameters in private declarations and unconstrained closures.

This complements avoid-positional-boolean-parameters, covering declarations that shipped rule skips. Enabling both gives full coverage of the explicit bool/bool? forms described here without duplicate diagnostics. Named arguments make boolean values understandable at call sites.

Private named functions (including local functions), constructors whose own name starts with _, and private methods without inherited contracts are checked. Closures are checked only as direct initializers of untyped variables or fields, not in arguments, returns, assignments, or typed declarations. The first required or optional positional bool/bool? is reported. Named parameters, public signatures, setters, operators, extension-type representation parameters, and Function(...) types are excluded, as are aliases and inferred field/super parameters. Explicit types must resolve to dart:core's bool, not a shadowing declaration or type parameter. Methods with override annotations or unresolved inheritance are left alone.

void _configure(bool verbose) {} // Prefer `{required bool verbose}`.
final configure = (bool verbose) {}; // Prefer `({required bool verbose})`.

Invalid

example.dartdart
void _configure(bool verbose) {}
void _optional([bool verbose = false]) {}
void _nullable(bool? enabled) {}
void _multiple(int count, bool verbose, bool dryRun) {}

class Settings {
  Settings._internal(bool enabled);
  Settings._optional([bool enabled = false]);
  factory Settings._factory(bool enabled) => Settings._internal(enabled);
  void _method(bool enabled) {}
  static void _staticMethod(bool? enabled) {}
  final callback = (bool enabled) {};
}

class Primary._hidden(bool enabled);

final callback = (bool enabled) {};
final nullableCallback = (bool? enabled) => enabled;
final optionalCallback = ([bool enabled = false]) {};

void outer() {
  void _local(bool enabled) {}
  final nested = (int count, bool enabled) {};
  void _generic<bool>(bool enabled) {}
  void _sibling(bool enabled) {}
  final generic = <bool>(bool enabled) {};
  final sibling = (bool enabled) {};
}

abstract class Contract {
  void _fixed(bool enabled);
}
class Annotated extends Contract {
  @override
  void _fixed(bool enabled) {}
}
class Unannotated extends Contract {
  void _fixed(bool enabled) {}
  void _independent(bool enabled) {}
}
class Generic<bool> {
  void _shadowed(bool enabled) {}
}
class AfterGeneric {
  void _unshadowed(bool enabled) {}
}
Prefer a named boolean parameter instead of a positional parameter.
1void _configure(bool verbose) {}
Prefer a named boolean parameter instead of a positional parameter.
1void _configure(bool verbose) {}
2void _optional([bool verbose = false]) {}
Prefer a named boolean parameter instead of a positional parameter.
2void _optional([bool verbose = false]) {}
3void _nullable(bool? enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
3void _nullable(bool? enabled) {}
4void _multiple(int count, bool verbose, bool dryRun) {}
Prefer a named boolean parameter instead of a positional parameter.
6class Settings {
7 Settings._internal(bool enabled);
Prefer a named boolean parameter instead of a positional parameter.
7 Settings._internal(bool enabled);
8 Settings._optional([bool enabled = false]);
Prefer a named boolean parameter instead of a positional parameter.
8 Settings._optional([bool enabled = false]);
9 factory Settings._factory(bool enabled) => Settings._internal(enabled);
Prefer a named boolean parameter instead of a positional parameter.
9 factory Settings._factory(bool enabled) => Settings._internal(enabled);
10 void _method(bool enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
10 void _method(bool enabled) {}
11 static void _staticMethod(bool? enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
11 static void _staticMethod(bool? enabled) {}
12 final callback = (bool enabled) {};
Prefer a named boolean parameter instead of a positional parameter.
14
15class Primary._hidden(bool enabled);
Prefer a named boolean parameter instead of a positional parameter.
16
17final callback = (bool enabled) {};
Prefer a named boolean parameter instead of a positional parameter.
17final callback = (bool enabled) {};
18final nullableCallback = (bool? enabled) => enabled;
Prefer a named boolean parameter instead of a positional parameter.
18final nullableCallback = (bool? enabled) => enabled;
19final optionalCallback = ([bool enabled = false]) {};
Prefer a named boolean parameter instead of a positional parameter.
21void outer() {
22 void _local(bool enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
22 void _local(bool enabled) {}
23 final nested = (int count, bool enabled) {};
Prefer a named boolean parameter instead of a positional parameter.
24 void _generic<bool>(bool enabled) {}
25 void _sibling(bool enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
26 final generic = <bool>(bool enabled) {};
27 final sibling = (bool enabled) {};
Prefer a named boolean parameter instead of a positional parameter.
30abstract class Contract {
31 void _fixed(bool enabled);
Prefer a named boolean parameter instead of a positional parameter.
38 void _fixed(bool enabled) {}
39 void _independent(bool enabled) {}
Prefer a named boolean parameter instead of a positional parameter.
44class AfterGeneric {
45 void _unshadowed(bool enabled) {}

Valid

example.dartdart
// Public signatures and Function types belong to the shipped rule.
void configure(bool verbose) {}
typedef Callback = void Function(bool enabled);
typedef void Legacy(bool enabled);
void _takesCallback(void callback(bool enabled)) {}
void _takesFunction(void Function(bool enabled) callback) {}

void _named({required bool verbose}) {}
void _optionalNamed({bool? enabled}) {}
void _nonBoolean(int count, String label) {}
void _inferred(enabled) {}

class Settings {
  final bool enabled;
  Settings(bool enabled) : enabled = enabled;
  Settings._inferred(this.enabled);
  Settings._named({required this.enabled});
  void _method({required bool enabled}) {}
  void method(bool enabled) {}
  set flag(bool value) {}
}

class Child extends Settings {
  Child._inferred(super.enabled);
}

class _PrivateClass {
  // Constructor privacy is determined by its own name, not its class name.
  _PrivateClass(bool enabled);
}

class NamedPrimary._hidden({required bool enabled});
class PublicPrimary(bool enabled);

set _flag(bool value) {}
final namedCallback = ({required bool enabled}) {};
final nonBooleanCallback = (int value) => value;
final inferredCallback = (value) => value;

void outer() {
  void local(bool enabled) {}
  void _localNamed({required bool enabled}) {}
}

// An alias is deliberately not an explicit bool spelling.
typedef Flag = bool;
void _alias(Flag enabled) {}

// Lexically shadowing type parameters are not dart:core bool.
void _generic<bool>(bool enabled) {}
final genericCallback = <bool>(bool enabled) {};
class Generic<bool> {
  Generic._hidden(bool enabled);
  void method() {
    void _local(bool enabled) {}
    final callback = (bool enabled) {};
  }
}
void enclosing<bool>() {
  void _local(bool enabled) {}
  final callback = (bool enabled) {};
}

// These positional signatures are fixed by their contexts.
void consume(void Function(bool) callback) {}
void contextualCallbacks() {
  consume((bool enabled) {});
  void Function(bool) callback = (bool enabled) {};
  callback = (bool enabled) {};
}
void Function(bool) returnedCallback() => (bool enabled) {};
final void Function(bool) typedCallback = (bool enabled) {};
class ContextualFields {
  final void Function(bool) callback = (bool enabled) {};
}

// A representation parameter must stay positional.
extension type Representation._hidden(bool enabled) {}

Configure prefer-named-boolean-parameters

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "style": {
        "prefer-named-boolean-parameters": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/style/prefer-named-boolean-parameters: <reason>