Kotlin’s property delegation feature combined with remember, gives birth to the by remember syntax, which offers a more concise and intuitive way to handle state.
Understanding the nuances between remember and by remember is crucial for writing clean, efficient, and maintainable Compose code.
Remembering State in Jetpack Compose
In Jetpack Compose, managing state across recompositions is crucial for maintaining UI consistency and performance. The remember function and its variant by remember are key tools for this purpose, each with its own syntax and use cases.
remember Function
The remember function is a fundamental building block in Compose for preserving state across recompositions. It memoizes the result of its computation, ensuring that the value is retained even when the composable function is recomposed.
Syntax and Usage
val mutableState = remember { mutableStateOf(initialValue) }
In this syntax, remember takes a lambda function that returns the value to be remembered. For mutable state, it’s common to use mutableStateOf inside remember.
Accessing and Modifying State
When using remember directly, you need to access the value through the .value property:
Text(text = "Count: ${mutableState.value}")
Button(onClick = { mutableState.value++ }) {
Text("Increment")
}
Key Characteristics
- Explicit Value Access: Requires
.valueto read or modify the state. - Flexibility: Allows remembering any type of value, not just mutable state.
- Composition: Can be easily composed with other functions or used in complex expressions.
by remember Delegate
The by remember syntax combines Kotlin’s property delegation with Compose’s remember function, offering a more concise and intuitive way to work with remembered mutable state.
Syntax and Usage
var count by remember { mutableStateOf(0) }
This syntax uses Kotlin’s by keyword to delegate the property to the result of remember { mutableStateOf(0) }.
Accessing and Modifying State
With by remember, you can directly access and modify the state as if it were a regular variable:
Text(text = "Count: $count")
Button(onClick = { count++ }) {
Text("Increment")
}
Key Characteristics
- Direct Access: No need for
.valueto read or modify the state. - Concise Syntax: Reduces boilerplate, making the code cleaner and more readable.
- Type Inference: Kotlin’s type inference works well with this syntax.
- Limited to Mutable State: Primarily used with
mutableStateOf, not for other types of remembered values.
Advanced Considerations
Performance Implications
Both remember and by remember have similar performance characteristics in terms of state retention. However, by remember might have a slight overhead due to property delegation.
Recomposition Behavior
Both approaches ensure that the state is preserved across recompositions. However, it’s important to note that unnecessary recompositions can still occur if the composable reads the state but doesn’t actually use the changed value.
Use with Keys
Both can be used with keys to control when the state should be reset:
val state = remember(key1, key2) { mutableStateOf(initialValue) }
var state by remember(key1, key2) { mutableStateOf(initialValue) }
Integration with Other Compose APIs
remember integrates seamlessly with other Compose APIs like derivedStateOf and produceState. For example:
val derivedState = remember { derivedStateOf { /* computation */ } }
While by remember is primarily used with mutableStateOf, it can also be used with custom delegate implementations that wrap other Compose state APIs.
Best Practices
- Choose one approach and use it consistently throughout your codebase.
- Use
by rememberfor simple state variables to improve readability. - For complex state management or when composing with other functions,
remembermight be more appropriate. - Remember to hoist state when necessary to maintain a unidirectional data flow.

