Nama: Richard Ryan
NRP: 5025211141
Kelas: PPB (G)
Tema: Woof App
Link Github : Github
Penjelasan Kode
Pertama set terlebih dahulu jenis tema yang akan digunakan
@Composable
fun WoofTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
dynamicColor: Boolean = false,
content: @Composable () -> Unit
) {
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context)
else dynamicLightColorScheme(context)
}
darkTheme -> DarkColors
else -> LightColors
}
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = colorScheme.primary.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
}
}
MaterialTheme(
colorScheme = colorScheme,
shapes = Shapes,
typography = Typography,
content = content
)
}
Setelah itu, buat data class Dog yang menyatakan bentuk entity dan daftar entity tersebut sebagai berikut
data class Dog(
@DrawableRes val imageResourceId: Int,
@StringRes val name: Int,
val age: Int,
@StringRes val hobbies: Int
)
val dogs = listOf(
Dog(R.drawable.koda, R.string.dog_name_1, 2, R.string.dog_description_1),
Dog(R.drawable.lola, R.string.dog_name_2, 16, R.string.dog_description_2),
Dog(R.drawable.frankie, R.string.dog_name_3, 2, R.string.dog_description_3),
Dog(R.drawable.nox, R.string.dog_name_4, 8, R.string.dog_description_4),
Dog(R.drawable.faye, R.string.dog_name_5, 8, R.string.dog_description_5),
Dog(R.drawable.bella, R.string.dog_name_6, 14, R.string.dog_description_6),
Dog(R.drawable.moana, R.string.dog_name_7, 2, R.string.dog_description_7),
Dog(R.drawable.tzeitel, R.string.dog_name_8, 7, R.string.dog_description_8),
Dog(R.drawable.leroy, R.string.dog_name_9, 4, R.string.dog_description_9)
)Kemudian set halaman utama sebagai berikut. Digunakan Scaffold sebab diperlukan top bar dan floating action button untuk mengubah light mode menjadi dark mode dan sebaliknya. Setelah itu, setiap item akan dimasukkan kedalam LazyColumn agar bisa discroll
@Composable
fun WoofApp() {
var isDarkTheme by remember { mutableStateOf(false) }
WoofTheme(darkTheme = isDarkTheme) {
Scaffold(
topBar = {
WoofTopAppBar()
},
floatingActionButton = {
FloatingActionButton(onClick = {
isDarkTheme = !isDarkTheme
}) {
Icon(
imageVector = Icons.Default.Brightness6,
contentDescription = "Toggle Theme"
)
}
}
) { it ->
LazyColumn(contentPadding = it) {
items(dogs) {
DogItem(
dog = it,
modifier = Modifier.padding(dimensionResource(R.dimen.padding_small))
)
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun WoofTopAppBar(modifier: Modifier = Modifier) {
CenterAlignedTopAppBar(
title = {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Image(
modifier = Modifier
.size(dimensionResource(R.dimen.image_size))
.padding(dimensionResource(R.dimen.padding_small)),
painter = painterResource(R.drawable.ic_woof_logo),
contentDescription = null
)
Text(
text = "Woof App - Richard",
style = MaterialTheme.typography.displayLarge
)
}
},
modifier = modifier
)
}
Setiap item akan dimasukkan ke konfigurasi Card sebagai berikut
@Composable
fun DogItem(
dog: Dog,
modifier: Modifier = Modifier
) {
Card(
modifier = modifier
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(dimensionResource(R.dimen.padding_small))
) {
DogIcon(dog.imageResourceId)
DogInformation(dog.name, dog.age)
}
}
}
fun DogIcon(
@DrawableRes dogIcon: Int,
modifier: Modifier = Modifier
) {
Image(
modifier = modifier
.size(dimensionResource(R.dimen.image_size))
.padding(dimensionResource(R.dimen.padding_small))
.clip(MaterialTheme.shapes.small),
contentScale = ContentScale.Crop,
painter = painterResource(dogIcon),
contentDescription = null
)
}
@Composable
fun DogInformation(
@StringRes dogName: Int,
dogAge: Int,
modifier: Modifier = Modifier
) {
Column(modifier = modifier) {
Text(
text = stringResource(dogName),
style = MaterialTheme.typography.displayMedium,
modifier = Modifier.padding(top = dimensionResource(R.dimen.padding_small))
)
Text(
text = stringResource(R.string.years_old, dogAge),
style = MaterialTheme.typography.bodyLarge
)
}
}


Comments
Post a Comment