Saltar al contenido

Dardo null / false / cheque vacío: ¿Cómo escribir esto más corto?

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 es null 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 y isNotNull. Ya no ofrecen promoción de tipo cuando Null 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 y isNotNull 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *