A partir de Dart 1.12, los operadores con reconocimiento de nulos están disponibles para este tipo de situación:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
El ?.operador cortocircuita a nulo si el lado izquierdo es nulo, y el ??operador devuelve el lado izquierdo si no es nulo y el lado derecho en caso contrario.
La declaración
outgoing[a]?.contains(b)
por lo tanto, evaluará nullsi outgoing[a]es null, o el resultado booleano de contains(b)si no es.
Eso significa que la declaración resultante será una de las siguientes:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
Lo mismo se aplica al inConnbooleano, lo que significa que ambos inConny outConnestán garantizados como no nulos, lo que nos permite devolver el resultado de ||los dos.
outgoing[a]?.contains(b)es peligroso, al menos con la semántica Groovy, porque cuandooutgoingesnull, toda la expresión se evalúa comonull. Entonces, de hecho, podría obtener algo comoreturn (null || true), que se lanzará en modo verificado.