Android compose setting view data in a composable
An app’s state is any value that can change over time. This is a very broad definition and encompasses everything from a Room database to a variable in a class.
All Android apps display state to the user. A few examples of state in Android apps are:
- The most recent messages received in a chat app.
- The user’s profile photo.
- The scroll position in a list of items.
Here is an example of a composable without state on it’s own, it only gets the state data from the parent component, in this case is the Int variable count, and it fire a click event when a button is clicked by calling the onIncrement function that is passed in to the composable.
@Composable fun StatelessCounter(count: Int, onIncrement: () -> Unit, modifier: Modifier = Modifier) { Column(modifier = modifier.padding(16.dp)) { if (count > 0) { Text("You've had $count glasses.") } Button( onClick = onIncrement, enabled = count < 10, modifier = Modifier.padding(top = 8.dp) ) { Text("Add one") } } }
Here is an example of a composable with a state in its component var count by rememberSaveable { mutableStateOf(0) }
, this is then passed to the stateless composable StatelessCounter alone with a callback function for handling the button click onIncrement = { count++ }
, when this callback function receives an event, it increases the variable count by 1, when the variable count is updated, it propagates the updated value to the StatelessCounter. StatelessCounter will then update the UI with the new value.
While remember helps you retain state across recompositions, it's not retained across configuration changes. For this, you must use rememberSaveable instead of remember. rememberSaveable automatically saves any value that can be saved in a Bundle.
@Composable fun StatefulCounter(modifier: Modifier = Modifier) { var count by rememberSaveable { mutableStateOf(0) } StatelessCounter( count = count, onIncrement = { count++ }, modifier = modifier ) }
Here is a complete code with the above.
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @Composable fun StatefulCounter(modifier: Modifier = Modifier) { var count by rememberSaveable { mutableStateOf(0) } StatelessCounter( count = count, onIncrement = { count++ }, modifier = modifier ) } @Composable fun StatelessCounter(count: Int, onIncrement: () -> Unit, modifier: Modifier = Modifier) { Column(modifier = modifier.padding(16.dp)) { if (count > 0) { Text("You've had $count glasses.") } Button( onClick = onIncrement, enabled = count < 10, modifier = Modifier.padding(top = 8.dp) ) { Text("Add one") } } } @Preview @Composable fun StatefulCounterPreview() { MaterialTheme { StatefulCounter() } }
Compose apps transform data into UI by calling composable functions. We refer to the Composition as the description of the UI built by Compose when it executes composables. If a state change happens, Compose re-executes the affected composable functions with the new state, creating an updated UIāthis is called recomposition. Compose also looks at what data an individual composable needs, so that it only recomposes components whose data has changed and skips those that are not affected.
The Composition: a description of the UI built by Jetpack Compose when it executes composables.
Initial composition: creation of a Composition by running composables the first time.
Recomposition: re-running composables to update the Composition when data changes.
Reference:
https://github.com/googlecodelabs/android-compose-codelabs
Search within Codexpedia
Search the entire web