I have the following form of assignment & null checks to avoid double lookups in my maps.
Is there a better or more idiomatic way to do this in Dart?
Posting the following, as I ended up here by searching the title.
As per https://github.com/dart-lang/sdk/issues/66, it seems that the answer to "What is the Dart null checking idiom or best practice?" is:
There is no null checking idiom or best practice in the general case. If null-aware operators don't fit your case use direct comparison as in if (object == null)
or if (object != null)
.
As of Dart 1.12 null-aware operators are available for this type of situation:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
The ?.
operator short-circuits to null if the left-hand side is null, and the ??
operator returns the left-hand side if it is not null, and the right-hand side otherwise.
The statement
outgoing[a]?.contains(b)
will thus either evaluate to null
if outgoing[a]
is null
, or the boolean result of contains(b)
if it is not.
That means the resulting statement will be one of the following:
bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
The same applies to the inConn
boolean, which means both inConn
and outConn
are guaranteed to be non-null, allowing us to return the result of ||
ing the two.
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;
There are now 4 null aware operators
return subject ?? "defaultIfNull";
This is similar to ?? but sets the subject variable to a default if it is null.
subject ??= "defaultIfNull";
object?.x
will return null if object is null, object.x
would cause an exception if object were null
the result of the following
[
...[1, 2],
null,
]
is [1, 2, null]
to avoid the null value use ...?
var resultingList = [
...[1, 2],
...?subjectList,
];