avoid-unused-after-null-check

Path
lint/correctness/avoid-unused-after-null-check
Default
Off, opt in
Origin
Falcon
Rule
182 of 512

Reports a null-checked local ignored by a branch that passes another local of the same resolved type to a call. Declaration identities keep shadowed names distinct. Branch-local replacements and unknown types are excluded.

Invalid

example.dartdart
void text(String? checked, String replacement) {
  if (checked != null) { print(replacement); }
}
void integer(int? checked, int replacement) {
  if (null != checked) { print(replacement); }
}
void decimal(double? checked, double replacement) {
  if ((checked) != null) { print(replacement); }
}
void boolean(bool? checked, bool replacement) {
  if (checked != null) { print(replacement); }
}
void consume({required String value}) {}
void named(String? checked, String replacement) {
  if (checked != null) { consume(value: replacement); }
}
void shadowed(String? checked, String replacement) {
  if (checked != null) { { final checked = 'other'; print(checked); } print(replacement); }
}
void headline(String value) {
  final String? myNullableValue = 'hello';
  if (myNullableValue != null) { print(value); }
}
class Item {}
void userType(Item? checked, Item replacement) {
  if (checked != null) { print(replacement); }
}
void numeric(num? checked, num replacement) {
  if (checked != null) { print(replacement); }
}
void matchingGeneric(List<int>? checked, List<int> replacement) {
  if (checked != null) { print(replacement); }
}
This null-checked variable is unused; check whether the branch uses the wrong variable.
1void text(String? checked, String replacement) {
2 if (checked != null) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
4void integer(int? checked, int replacement) {
5 if (null != checked) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
7void decimal(double? checked, double replacement) {
8 if ((checked) != null) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
10void boolean(bool? checked, bool replacement) {
11 if (checked != null) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
14void named(String? checked, String replacement) {
15 if (checked != null) { consume(value: replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
17void shadowed(String? checked, String replacement) {
18 if (checked != null) { { final checked = 'other'; print(checked); } print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
21 final String? myNullableValue = 'hello';
22 if (myNullableValue != null) { print(value); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
25void userType(Item? checked, Item replacement) {
26 if (checked != null) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
28void numeric(num? checked, num replacement) {
29 if (checked != null) { print(replacement); }
This null-checked variable is unused; check whether the branch uses the wrong variable.
31void matchingGeneric(List<int>? checked, List<int> replacement) {
32 if (checked != null) { print(replacement); }

Valid

example.dartdart
void usesChecked(String? checked, String replacement) {
  if (checked != null) { print(checked); print(replacement); }
}
void unrelated(String? checked, int count) {
  if (checked != null) { print(count); }
}
void literal(String? checked) {
  if (checked != null) { print('ready'); }
}
void nullBranch(String? checked, String replacement) {
  if (checked == null) { print(replacement); }
}
void empty(String? checked) { if (checked != null) {} }
void compound(String? checked, String replacement) {
  if (checked != null && checked.isNotEmpty) { print(replacement); }
}
void captured(String? checked, String replacement) {
  if (checked != null) {
    void use() { print(checked); }
    print(replacement);
    use();
  }
}
void elseOnly(String? checked, String replacement) {
  if (checked != null) {} else { print(replacement); }
}
void alreadyNonNull(String checked, String replacement) {
  if (checked != null) { print(replacement); }
}
void branchLocal(String? token, List<String> lines) {
  if (token != null) { for (final line in lines) print(line); }
}
void onlyShadowed(String? checked) {
  if (checked != null) { final checked = 'other'; print(checked); }
}
void callbackParameter(String? checked, List<String> lines) {
  if (checked != null) { lines.forEach((String line) { print(line); }); }
}
void genericMismatch(List<int>? checked, List<String> replacement) {
  if (checked != null) { print(replacement); }
}

Configure avoid-unused-after-null-check

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "avoid-unused-after-null-check": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/correctness/avoid-unused-after-null-check: <reason>
  • avoid-unused-parametersavoid-unused-parametersrecommended

    Disallow declared parameters that are never used, excluding primary constructors.

  • avoid-watch-outside-buildrecommendedprovider

    Flags listening Provider accesses proven to run outside Flutter builds.

  • avoid-web-libraries-in-flutteravoid_web_libraries_in_flutterrecommendedflutter

    Disallow importing web-only dart: libraries from Flutter code.

  • await-only-futuresawait_only_futuresrecommended

    Await only values assignable to futures; FutureOr, dynamic, bottom types and extension types are accepted like the analyzer.

  • banned-importscross-file

    Report imports forbidden by package-relative architectural boundaries.

  • cancel-subscriptionscancel_subscriptionsrecommended

    Cancel instances of dart:async StreamSubscription.

  • check-is-not-closed-after-async-gaprecommendedbloc

    Flags Bloc add and emit calls after an await without a fresh isClosed check.

  • close-sinksclose_sinksrecommended

    Close instances of dart:core Sink.