@Composable์ด๋
์๋๋ก์ด๋ ์ปดํฌ์ฆ ๊ธฐ๋ฐ ๊ฐ๋ฐ ์ด๋ ค์ด๊ฒ ์๋ค.
์ปดํผ์ ๋ธ๋ก ์์ํด์ ์ปดํผ์ ๋ธ๋ก ๋๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ฌ๋ฌ ui ์ ์ธ ๋ฐฉ์ ์ค์ ์ปดํผ์ ๋ธ์ด ์ ์ผ ๊น๋ํ๊ณ ์ฐ๊ธฐ๊ฐ ์ฝ๋ค๊ณ ์๊ฐํ๋ค.
์ปดํฌ์ฆ์ ๊ฒฝ์ฐ ui ํจ์ํ ์ ์ธ๋ฐฉ์์ด๊ณ , ์ค์ํํธui ๊ฒฝ์ฐ ๊ตฌ์กฐ์ฒด ์ ์ธ๋ฐฉ์์ด๋ค. ๊ทธ๋์ class ์คํ์ผ์ ๊ฐ์ ธ๊ฐ๋ค.
๊ทธ๋๋ง ์ปดํผ์ ๋ธ์ด๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ๋น์ทํ์ง ์์๊น?
package com.buyoungsil.checkcheck.feature.group.presentation.list
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ExitToApp
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.buyoungsil.checkcheck.feature.group.domain.model.Group
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun GroupCard(
group: Group,
onClick: () -> Unit,
onLeave: () -> Unit
) {
Card(
modifier = Modifier.fillMaxWidth(),
onClick = onClick
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = group.icon,
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.padding(end = 16.dp)
)
Column(modifier = Modifier.weight(1f)) {
Text(
text = group.name,
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold
)
Text(
text = "${group.type.displayName} ยท ${group.memberIds.size}๋ช
",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Text(
text = "์ด๋์ฝ๋: ${group.inviteCode}",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.primary
)
}
IconButton(onClick = onLeave) {
Icon(
imageVector = Icons.Default.ExitToApp,
contentDescription = "๋๊ฐ๊ธฐ",
tint = MaterialTheme.colorScheme.error
)
}
}
}
}์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ฌ์ฉ์ค์ธ ์ปดํผ์ ๋ธ ์ฝ๋๋ฅผ ํ๋ ๊ฐ์ ธ์๋ค.
์ปดํผ์ ๋ธ์ ํจ์ํ ui์ด๋ค.
ํจ์๋ ์๋ค์ํผ ํฌ์ -> ๊ณผ์ -> ๊ฒฐ๊ณผ ํํ๋ฅผ ๋ด๋ค.
์ฌ๊ธฐ์ ํฌ์ ์ ํ๋ผ๋ฏธ๋ฌ group, onclik. onLeave ๋ผ๋ ๊ฒ์ ๋ฃ์์ ๋
GroupCard๋ผ๋ ui ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ํฌ์ ์๋ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋ค.
๋ณ์๋ฅผ ๋ด๋ ค๋ณด๋ผ ์ ์๊ณ , ์๋๋ฉด ๋๋ค ์ฆ ์ฝ๋ฐฑํจ์๋ฅผ ๋ด๋ ค๋ณด๋ผ ์ ์๋ค.
์ฝ๋ฐฑ ํจ์๋ผ๋๊ฑด ์์ฒญ์ด ์๊ณ ๋๋์์ค๋ ๊ฒ์ด ์๋ค๋ ๋ป์ด๋ค.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun GroupCard(
group: Group,
onClick: () -> Unit,
onLeave: () -> Unit
) {
Card(
modifier = Modifier.fillMaxWidth(),
onClick = onClick
) {
IconButton(onClick = onLeave) {
Icon(
imageVector = Icons.Default.ExitToApp,
contentDescription = "๋๊ฐ๊ธฐ",
tint = MaterialTheme.colorScheme.error
)
}
}
}
}์ ์ฌ๊ธฐ์ onclick ์ด๋ผ๋ ์ฝ๋ฐฑํจ์๊ฐ ์๋ค. card์์ onclick๋ฅผ ๋๋ ์ ๋ ์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋๊ณ ์ด ๋ก์ง์ ์์๋ทฐ๋ก ์ ๋ฌ๋๋ค.
GroupCard(
group = group,
onClick = { onNavigateToDetail(group.id) },
onLeave = { viewModel.onLeaveGroup(group.id) }
)์ด๋ ๊ฒ ์์ ๋ทฐ์์ onclick์ผ๋ก onNavigateToDetail(group.id) ์ด๊ฑฐ ์คํํด์ค ๋ผ๋ ๋ป์ด ๋๋ ๊ฒ์ด๋ค.
์ ๊ทธ๋ผ ์ฐ๋ฆฐ ์๊ฐํ ์ ์๋ค. ์ด๊ฑด ์ด๋ฒคํธ๋ง ํธ์ถํ ๊ฒ์ด๊ณ ์ฝ๋ฐฑํจ์์ ๋ค๋ฅธ ๊ฐ๋ค์ ์ถ๊ฐํด์ ์ฌ๋ ค ๋ณด๋ผ ์ ์๊ฒ ๊ตฌ๋?
๋ง๋ค.
์๋ฅผ๋ค์ด
@composable
fun Test(
onClick: (string) -> Unitโ
)โ
Test(
onClick = { string ->
}
)โ์ด๋ฐ์์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
