Tutorial #30: Putting It All Together - A Complete Task Item
Let's build a polished, interactive task list item combining: state, theming, icons, interaction, and visual feedback.
```kotlin
data class Task(
val id: Int,
val title: String,
val dueDate: String,
var isCompleted: Boolean
)
@Composable
fun TaskItem(
task: Task,
onToggleComplete: (Int) -> Unit,
onTaskClick: (Int) -> Unit,
modifier: Modifier = Modifier
) {
Card(
modifier = modifier
.fillMaxWidth()
.clickable { onTaskClick(
task.id) },
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
colors = CardDefaults.cardColors(
containerColor = if (task.isCompleted)
MaterialTheme.colors.surface.copy(alpha = 0.5f)
else MaterialTheme.colors.surface
)
) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
// Checkbox and Content
Row(verticalAlignment = Alignment.CenterVertically) {
// Custom Checkbox
Box(
modifier = Modifier
.size(24.dp)
.border(
width = 2.dp,
color = if (task.isCompleted)
Color.Green else Color.Gray,
shape = CircleShape
)
.clickable { onToggleComplete(
task.id) }
.background(
if (task.isCompleted)
Color.Green.copy(alpha = 0.2f)
else Color.Transparent
),
contentAlignment =
Alignment.Center
) {
if (task.isCompleted) {
Icon(
Icons.Filled.Check,
contentDescription = "Completed",
tint =
Color.Green,
modifier = Modifier.size(16.dp)
)
}
}
Spacer(modifier = Modifier.width(16.dp))
// Task Details
Column {
Text(
text = task.title,
style = MaterialTheme.typography.body1,
modifier = Modifier.fillMaxWidth(0.8f),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textDecoration = if (task.isCompleted)
TextDecoration.LineThrough
else TextDecoration.None,
color = if (task.isCompleted)
Color.Gray
else MaterialTheme.colors.onSurface
)
Text(
text = "Due: ${task.dueDate}",
style = MaterialTheme.typography.caption,
color = Color.Gray
)
}
}
// Action Icon
IconButton(onClick = { onTaskClick(
task.id) }) {
Icon(
imageVector = Icons.Outlined.ArrowForwardIos,
contentDescription = "View Details",
tint = MaterialTheme.colors.primary
)
}
}
}
}
```
Final Synthesis: This component uses: Card for elevation, Row/Column for layout, MaterialTheme for consistency, clickable for interaction, conditional styling for state, and icons for affordance. #Android#UI
#UX #JetpackCompose #FinalProject #ComponentDesign