JetpackCompose.app Home

ifNotNull Modifier

Author: John Doe

Modifiers are one of my favorite features of Jetpack Compose. They allow you to visually update a composable function and add more functionality to them. One of the reasons they are so elegant is because you can chain them. This results in an intuitive API that's easy to work with. Here's an example-

@composable
fun MyComponent() {
  Box(
    modifier = Modifier
      .fillMaxWidth()
      .background(Color.Cyan)
      .padding(16.dp)
      .
  ) {...}
}

Note: The order in which the Modifiers are applied makes a difference to the end result.

When using these API's in real world scenarios, you are often in a situation where you want to apply Modifiers only when a certain object is non-null. Let's look at one such example-

fun MyComponent(
  errorMetadata: ErrorMetadata? = null
) {
  var modifierChain = Modifier.fillMaxWidth()
  if (errorMetadata != null) {
    modifierChain = modifierChain.background(Color.Red)
  }
  Box(
    modifier = modifierChain
      .padding(16.dp)
  ) {...}
}

Here, we want to add the background modifier only if the errorMetadata prop is non-null. In order to make sure we chain them properly, we need to hold a reference to the modifier chain and add the background modifier to this reference when errorMetadata is non-null. This can get out of hand really quickly when you have multiple conditions that determine which Modifier needs to be applied.

* ifNotNull Modifier has entered the chat *

Using this simple and elegant snippet, I can add the conditional logic in the chain itself and the code looks significantly cleaner now!

fun MyComponent(
  errorMetadata: ErrorMetadata? = null
) {
  Box(
    modifier = Modifier.fillMaxWidth()
      .ifNotNull(errorMetadata) { background(Color.Red) }
      .padding(16.dp)
  ) {...}
}

Slick isn't it?

Have a project you'd like to submit? Fill this form, will ya!

JetpackCompose.app Job Board

Find the best Android jobs in world-class companies. Here are some featured jobs from the job board