If you come from the world of classic Android views, you're probably used to struggling with the
Essentially, any data that can change over time, from a simple string of text in a form to a complex database in Room, is considered state. To prevent our app from freezing and to ensure it reacts to user actions, we need Compose to know exactly what that state is.
The heart of the state: mutableStateOf and Recomposition
To let an interface element know that something has changed, it's not enough to use a regular Kotlin variable. We need a
When the value of this object changes, Compose marks the function as "invalid" and executes it again. This is what we call
There are several ways to write these declarations to make the code cleaner. We can use delegate syntax with the keyword Kotlin for Android programming.
Making memory work with remember
A common problem when starting out is that recomposition is basically just re-executing the function. If we declare the state directly within the Composable,
The function
To solve the problem of rotations, we have lifecycle of an activity in AndroidIf we want to save complex objects that are not compatible with the default Bundle, we can use annotation.
State Hoisting
Having the state inside a component makes it easier to use initially, but it also makes it rigid, difficult to test, and less reusable. The technique of
In practice, this means replacing the state variable with two parameters: one that represents the
Following this plan has huge advantages. On the one hand, we have a
Advanced Optimization and Side Effects

As apps grow, performance becomes critical. We don't want the entire screen to recompose for a minor change. That's why Compose offers
When we need to interact with non-Compose code (such as sending a network request or setting up a listener), we use Effects.
To integrate modern data flows, such as Flow or LiveData, we have extension features such as
Key Control and Stability
Sometimes we want a remembered value to be updated not only by recomposition, but because an external variable has changed.
To improve efficiency, it is vital to use classes marked as
Mastering the interaction between