null_closures
Do not pass null
as an argument where a closure is expected.
This rule is available as of Dart 2.0.0.
Rule sets: recommended, flutter
This rule has a quick fix available.
Details
DON’T pass null
as an argument where a closure is expected.
Often a closure that is passed to a method will only be called conditionally,
so that tests and “happy path” production calls do not reveal that null
will
result in an exception being thrown.
This rule only catches null literals being passed where closures are expected in the following locations:
Constructors
- From
dart:async
-
Future
at the 0th positional parameter -
Future.microtask
at the 0th positional parameter -
Future.sync
at the 0th positional parameter -
Timer
at the 0th positional parameter -
Timer.periodic
at the 1st positional parameter
-
- From
dart:core
-
List.generate
at the 1st positional parameter
-
Static functions
- From
dart:async
-
scheduleMicrotask
at the 0th positional parameter -
Future.doWhile
at the 0th positional parameter -
Future.forEach
at the 0th positional parameter -
Future.wait
at the named parametercleanup
-
Timer.run
at the 0th positional parameter
-
Instance methods
- From
dart:async
-
Future.then
at the 0th positional parameter -
Future.complete
at the 0th positional parameter
-
- From
dart:collection
-
Queue.removeWhere
at the 0th positional parameter - `Queue.retain
-
Iterable.firstWhere
at the 0th positional parameter, and the named parameterorElse
-
Iterable.forEach
at the 0th positional parameter -
Iterable.fold
at the 1st positional parameter -
Iterable.lastWhere
at the 0th positional parameter, and the named parameterorElse
-
Iterable.map
at the 0th positional parameter -
Iterable.reduce
at the 0th positional parameter -
Iterable.singleWhere
at the 0th positional parameter, and the named parameterorElse
-
Iterable.skipWhile
at the 0th positional parameter -
Iterable.takeWhile
at the 0th positional parameter -
Iterable.where
at the 0th positional parameter -
List.removeWhere
at the 0th positional parameter -
List.retainWhere
at the 0th positional parameter -
String.replaceAllMapped
at the 1st positional parameter -
String.replaceFirstMapped
at the 1st positional parameter -
String.splitMapJoin
at the named parametersonMatch
andonNonMatch
-
BAD:
[1, 3, 5].firstWhere((e) => e.isOdd, orElse: null);
GOOD:
[1, 3, 5].firstWhere((e) => e.isOdd, orElse: () => null);
Usage
To enable the null_closures
rule,
add null_closures
under linter > rules in your
analysis_options.yaml
file:
linter:
rules:
- null_closures