Cómo hacer comprobaciones nulas con las funciones de extensión de Kotlin en una actividad de Android

Soy nuevo en Kotlin e bash convertir uno de los muchos methods Android Util que tenemos en nuestra base de código existente en una function de extensión de Kotlin.

Este es el código de Kotlin:

fun Activity?.isAlive(): Boolean { return !(this?.isFinishing ?: false) } 

Que se supone que es el equivalente de este método de Java:

 public static boolean isAlive(Activity activity) { return activity != null && !activity.isFinishing(); } 

Sin embargo, sigo obteniendo NPEs en el código de Kotlin cuando una Activity es null . ¿Alguna idea de dónde me estoy equivocando?

Supongo que obtienes NPE no en la function isAlive() sino más isAlive() , cuando se hace reference a la Activity . Esto es probablemente causado por el hecho de que .isAlive() devuelve true en el receptor null .

Eso es porque si el receptor es null , this?.isFinishing ?: false elige la twig derecha como false , por lo tanto !(this?.isFinishing ?: false) es true .

Intente cambiar su function de cualquier manera para que devuelva false en el receptor null , por ejemplo:

 fun Activity?.isAlive(): Boolean = !(this?.isFinishing ?: true) 

Sugeriría escribir

 fun Activity?.isAlive(): Boolean = this != null && !this.isFinishing 

Encuentro que la verificación y la condición nula separadas son más fáciles de leer que las versiones combinadas.

  • Kotlin - lateinit VS Cualquiera? = nulo
  • Kotlin null-safety para properties de class
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Cómo probar idiomáticamente cadenas no nulas y no vacías en Kotlin?
  • kotlin inversa boolean seguro de casting
  • Kotlin security nula?
  • Las comprobaciones nulas no se insertan para el tipo reificado cuando param no es nulo
  • ¿Cómo definir un miembro delegado que se puede anotar en Kotlin?
  • Combine security nula y assertNotNull
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • Asignación variable de nula Kotlin