Ya no necesitas buscar más en otros sitios porque llegaste al lugar indicado, poseemos la respuesta que necesitas encontrar pero sin liarte.
Solución:
Si su requerimiento estaba simplemente vacío o null (como el mío cuando vi este título en un resultado de búsqueda), puede usar el operador de navegación segura de Dart para hacerlo un poco más conciso:
if (routeinfo["no_route"]?.isEmpty ?? true)
//
Dónde
isEmpty
comprueba si hay una cadena vacía, pero si routeinfo esnull
no puedes llamar isEmpty on null, entonces buscamos null con?.
operador de navegación segura que solo llamará a isEmpty cuando el objeto no esté null y producir null de lo contrario. Así que solo tenemos que comprobar null con??
null operador coalescente
Podrías hacerlo
if (["", null, false, 0].contains(routeinfo["no_route"]))
// do sth
Actualización de finales de 2020
Resumen
- Esta respuesta tiene true, excepto por
isNull
yisNotNull
. Ya no ofrecen promoción de tipo cuandoNull Safety
se introduce en dardo / aleteo en el futuro. - Otros ayudantes como
isNullOrEmpty
no proporcionan promoción de tipo, ya que están en un (sub) alcance diferente en comparación con el sitio de llamadas. - Mi opinión personal, es que puedes dejar
isNull
yisNotNull
pero mantenga a otros ayudantes, ya que no debe esperar que realicen promociones de tipo por usted.
Explicación
- Esto es porque
Null Safety
finalmente se introdujo en Dart / Flutter. Pero a partir de octubre de 2020, esta función aún no está disponible para lanzamientos estables en dart / flutter. Consulte la guía rápida Seguridad nula o el completo Comprender la seguridad nula. - La seguridad nula en Dart / Flutter debe ser similar a Swift (opcional) y Kotlin (tipos que aceptan valores NULL, tipos que no aceptan valores NULL).
Demostración
Aquí hay una demostración de por qué la encapsulación / ayudante-captador de isNull
(== null
) y isNotNull
(!= null
) es un problema muy grande:
// Promotion works
int definitelyInt(int? aNullableInt)
if (aNullableInt == null) // Promote variable `aNullableInt` of Nullable type `int?` to Non-Nullable type `int`
return 0;
return aNullableInt; // Can't be null! This variable is promoted to non-nullable type `int`
Cuando se envía “Seguridad nula” en el lanzamiento de dardos que está utilizando, ¡la promoción de tipo en el código anterior funciona! SIN EMBARGO:
// Promotion does NOT work!!!
int definitelyInt(int? aNullableInt)
if (aNullableInt.isNull) // does NOT promote variable `aNullableInt` of Nullable type `int?`
return 0;
return aNullableInt; // This variable is still of type `int?`!!!
Lo anterior no funciona, porque el null cheque == null
y != null
se encapsulan en un subámbito (marco de pila diferente) y no se infiere que tengan este efecto de “promoción” dentro de definitelyInt
alcance.
Actualización de principios de 2020
Aquí hay una versión modificada usando captadores en lugar de métodos de instancia / clase y cubriendo espacios en blanco, es nulo, y No es nulo.
Segunda actualización
¡También tiene en cuenta listas y mapas vacíos ahora!
Tercera actualización
Se agregaron captadores privados para seguridad y modularidad / mantenibilidad.
Cuarta actualización
Se actualizó la respuesta para solucionar un problema particular con Map
, ¡no se maneja correctamente cuando está vacío! Porque Map
no es un Iterable
. Resolvió este problema introduciendo _isMapObjectEmpty
U
Solución
extension TextUtilsStringExtension on String
/// Returns true if string is:
/// - null
/// - empty
/// - whitespace string.
///
/// Characters considered "whitespace" are listed [here](https://stackoverflow.com/a/59826129/10830091).
bool get isNullEmptyOrWhitespace =>
this == null
/// - [isNullOrEmpty], [isNullEmptyOrFalse], [isNullEmptyZeroOrFalse] are from [this StackOverflow answer](https://stackoverflow.com/a/59826129/10830091)
extension GeneralUtilsObjectExtension on Object
_isStringObjectEmpty
Supuestos
Esto supone que Dart 2.7 o superior es compatible con los métodos de extensión.
Uso
Las anteriores son dos clases de extensión. Uno para Object
y uno para String
. Colóquelos en un archivo por separado / juntos e importe los archivos / archivo en el archivo del sitio de llamadas.
Descripción
Viniendo de Swift, tiendo a usar extensiones como la respuesta del usuario @Benjamin Menrad pero con getter en lugar de método / función cuando corresponde, reflejando las propiedades calculadas de Dart como String.isEmpty
.
Viniendo de C #, me gusta el método auxiliar de String, IsNullOrWhiteSpace.
Mi versión fusiona los dos conceptos anteriores.
Nombrar
Cambie el nombre de las clases de Extensión como desee. Tiendo a nombrarlos así:
XYExtensión
Dónde:
- X es Archivo / Autor / Aplicación / Nombre único.
- Y es el nombre del tipo que se está ampliando.
Ejemplos de nombres:
MyAppIntExtension
DartDoubleExtension
TextUtilsStringExtension
OHProviderExtension
Crítica
Por qué captadores privados en lugar de simples
this == null || this == '' || this == [] || this == 0 || !this
- Creo que esto es más seguro ya que primero lanza el objeto al tipo correcto con el que queremos comparar su valor.
- Más modular ya que los cambios son fundamentales dentro de los captadores privados y cualquier modificación se refleja en todas partes.
- Si la verificación de tipo falla dentro del getter privado, regresamos false que no afecta el resultado de la expresión raíz lógica-OR.
Si eres capaz, tienes la habilidad dejar un artículo acerca de qué te ha parecido esta sección.