2017-08-20 6 views
0

Je reçois un problème intéressant. Lorsque je débogue mon application isResColorId est false. Malheureusement, la fonction let est déclenchée, et je vois qwe sur logcat.Android infixe kotlin numéro

fun drawableTint(context: Context, view: View, colorID: Int, isResColorId: Boolean = true) { 
    try { 
     val wrap = DrawableCompat.wrap(view.background) 
     DrawableCompat.setTint(wrap, isResColorId then let { Timber.d("qwe"); ContextCompat.getColor(context, colorID) } ?: colorID) 
     view.setBackgroundDrawable(wrap) 
    }catch (e: Resources.NotFoundException){ 
     Timber.e(e, "c_id: $colorID coz: $isResColorId") 
    } 
} 

infix fun <T> Boolean.then(param: T): T? = if (this) param else null 

Logcat:

qwe 

Répondre

2

Pour être sûr de ce qui se passe, vous devez imprimer it intérieur du lambda. Mais ce qui est sans doute qui se passe est:

isResColorId.then(this.let({...})) ?: colorId 

Cela signifie que le bloc à l'intérieur let est toujours évaluée.

1

Si vous ne voulez pas évaluer le deuxième argument de la fonction infixe si le premier est faux, vous devriez passer un lambda et non une valeur:

inline infix fun <T> Boolean.then(block:() -> T): T? = if (this) block() else null 

Mais dans ce cas, je préférait écrire if (condition) A else B directement, plutôt que de retourner une valeur NULL qui introduit la boxe et vous oblige à vérifier null ensuite en utilisant l'opérateur elvis.