====== Jetpack Compose Tutorial ======
[[https://developer.android.com/jetpack/compose/tutorial|Jetpack Compose Tutorial]] is small [[Android Jetpack Compose]] tutorial by Google -> good to start
===== Lesson 1: Composable functions =====
* To create a composable function just add ''@Composable'' annotation to the function name
* In ''onCreate'' create a ''setContent'' block and call there the composable
* The ''setContent'' block defines the activity's layout where composable functions are called.
* Composable functions can only be called from other composable functions.
* ''@Preview'' annotation helps to see the previews of Composable functions within Android Studio
* The function annotated with ''@Preview'' should have NO parameters
===== Lesson 2: Layouts =====
* In Compose, a UI hierarchy will be built by calling composable functions from other composable functions
* ''Column'' -> builds elements vertically:
* author
* text
@Composable
fun MessageCard(msg: Message) {
Column {
Text(text = msg.author)
Text(text = msg.body)
}
}
* ''Row'' -> builds elements horizontally:
* author | text
* To decorate or configure a composable Jetpack Compose uses modifiers:
@Composable
fun MessageCard(msg: Message) {
// Add padding around our message
Row(modifier = Modifier.padding(all = 8.dp)) {
Image(
painter = painterResource(R.drawable.profile_picture),
contentDescription = "Contact profile picture",
modifier = Modifier
// Set image size to 40 dp
.size(40.dp)
// Clip image to be shaped as a circle
.clip(CircleShape)
)
// Add a horizontal space between the image and the column
Spacer(modifier = Modifier.width(8.dp))
Column {
Text(text = msg.author)
// Add a vertical space between the author and message texts
Spacer(modifier = Modifier.height(4.dp))
Text(text = msg.body)
}
}
}
===== Lesson 3: Material design =====
* Jetpack Compose provides an implementation of Material Design 3
* To start, wrap the ''MessageCard'' function with the Material theme created in your project, ''ComposeTutorialTheme'', as well as a ''Surface''
* Material Design is built around three pilars:
* Color
* ''MaterialTheme.colorSheme''
* Typography
* ''MaterialTheme.typography.titleSmall''
* ''MaterialTheme.typography. ...''
* Shape
* ''MaterialTheme.shapes.medium''
* ''MaterialTheme.shapes. ...''
* Enable dark theme
* ''@Preview (uiMode = Configuration.UI_MODE_NIGHT_YES)''
===== Lesson 4: Lists and animations =====
* Create a list of messages
* Use Compose's ''LazyColumn'' and ''LazyRow'' because they shows only elements, which are on the screen
* => efficient
* Animate message while expanding
* to keep track of whether message has been expanded or not, use the Composable functions
* ''remember''
* ''mutableStateOf''
* Recomposition
* redraw automatically when the value is updated