Files
skills/skills/create-flutter-app-native-ui/examples/android/TasksApp.kt
T
rodydavis 5cc939e120
Update README / update-readme (push) Successful in 7s
feat: Add create-flutter-app-native-ui skill
2026-06-27 20:47:13 -07:00

83 lines
2.6 KiB
Kotlin

package com.example.tasks_interop
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TasksApp(
tasks: List<TaskData>,
onAddTask: (String) -> Unit,
onToggleTask: (String) -> Unit,
onDeleteTask: (String) -> Unit
) {
var newTaskTitle by remember { mutableStateOf("") }
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
TextField(
value = newTaskTitle,
onValueChange = { newTaskTitle = it },
modifier = Modifier.weight(1f),
singleLine = true
)
Spacer(modifier = Modifier.width(8.dp))
IconButton(
onClick = {
if (newTaskTitle.isNotBlank()) {
onAddTask(newTaskTitle.trim())
newTaskTitle = ""
}
}
) {
Icon(Icons.Default.Add, contentDescription = "Add")
}
}
LazyColumn {
items(tasks, key = { it.id }) { task ->
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(
checked = task.isCompleted,
onCheckedChange = { onToggleTask(task.id) }
)
Text(
text = task.title,
modifier = Modifier.weight(1f)
)
IconButton(onClick = { onDeleteTask(task.id) }) {
Icon(Icons.Default.Delete, contentDescription = "Delete")
}
}
}
}
}
}