Уже середина 2024 года. Как глухой независимый разработчик, я часто время от времени размышляю о себе: какого прогресса я достиг за последние шесть месяцев? В этой статье я рассказываю о случае реализации приложения списка CURD с использованием Jetpack Compose, Material3 и языка Kotlin. Независимо от того, есть у вас опыт разработки или нет, я уверен, что эта статья будет вам очень полезна.
Практичность и распространенность приложения CURD List стали типичным примером разработки, охватывающим базовые аспекты разработки, такие как управление данными, пользовательский интерфейс и UX.
В этой демонстрации реализованы следующие функции:
• Используйте LazyColumn для отображения списков CURD.
• Поддержка пользователей для динамического добавления, редактирования и удаления элементов списка.
• Используйте State и MutableState для управления синхронными обновлениями данных и пользовательского интерфейса.
Демо использует архитектуру MVVM. ViewModel отвечает за управление состоянием приложения и бизнес-логикой, а Compose отвечает за рендеринг пользовательского интерфейса, обеспечивая разделение данных и представлений.
Используйте LazyColumn для отображения списка CURD. Каждый элемент списка отображает имя и количество, а также содержит кнопки редактирования и удаления.
@Composable
fun ListItem(item: ShoppingItem, onEditClick: () -> Unit, onDeleteClick: () -> Unit) {
Row(
modifier = Modifier
.padding(8.dp)
.fillMaxWidth()
.border(
border = BorderStroke(2.dp, Color(0XFF018786)),
shape = RoundedCornerShape(20)
),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(text = item.name, modifier = Modifier.padding(8.dp))
Text(text = "ID: ${item.quantity}", modifier = Modifier.padding(8.dp))
Row(modifier = Modifier.padding(8.dp)) {
IconButton(onClick = onEditClick) {
Icon(imageVector = Icons.Default.Edit, contentDescription = null)
}
IconButton(onClick = onDeleteClick) {
Icon(imageVector = Icons.Default.Delete, contentDescription = null)
}
}
}
}
Компонент ListItem отображает подробную информацию об элементах списка, а IconButton предоставляет функции редактирования и удаления для каждого элемента списка.
Всплывающее окно реализовано через AlertDialog. Пользователи могут вводить новые записи во всплывающем окне и нажимать кнопку «Добавить», чтобы обновить данные в списке CURD.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ListApp() {
var sItems by remember { mutableStateOf(listOf<ShoppingItem>()) }
var itemName by remember { mutableStateOf("") }
var itemQuantity by remember { mutableStateOf("") }
var showDialog by remember { mutableStateOf(false) }
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center
) {
Text(
text = "@Nim инди-разработчик",
color = Color.Black,
style = TextStyle(fontWeight = FontWeight.Bold),
fontSize = 40.sp,
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(20.dp)
)
Button(
onClick = { showDialog = true },
modifier = Modifier.align(Alignment.CenterHorizontally)
) {
Текст("Новая запись")
}
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
items(sItems) { item ->
ListItem(
item = item,
onEditClick = { /* Редактировать логику */ },
onDeleteClick = { sItems = sItems - item }
)
}
}
}
if (showDialog) {
itemQuantity = "1"
AlertDialog(
onDismissRequest = { showDialog = false },
title = { Текст("Добавить запись") },
text = {
Column {
OutlinedTextField(
value = itemName,
onValueChange = { itemName = it },
singleLine = true,
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
OutlinedTextField(
value = itemQuantity,
onValueChange = {
itemQuantity = it
},
singleLine = true,
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
}
},
confirmButton = {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Button(
onClick = {
if (itemName.isNotBlank()) {
val newItem = ShoppingItem(
id = sItems.size + 1,
name = itemName,
quantity = itemQuantity.toInt()
)
sItems = sItems + newItem
showDialog = false
itemName = ""
}
}
) {
Текст («Добавить»)
}
Button(
onClick = { showDialog = false }
) {
Текст("Отмена")
}
}
}
)
}
}
AlertDialog используется для создания всплывающего окна ввода, через которое пользователь может добавлять новые элементы в список. LazyColumn используется для отображения всех элементов списка, добавленных пользователем.
Функция редактирования реализована с помощью ShoppingItemEditor. Пользователи могут изменять существующие элементы в состоянии редактирования и сохранять измененные данные.
@Composable
fun ShoppingListItem(item: ShoppingItem,
onEditClick: () -> Unit,
onDeleteClick: () -> Unit) {
Row(
modifier = Modifier
.padding(8.dp)
.fillMaxWidth()
.border(
border = BorderStroke(2.dp, Color(0XFF018786)),
shape = RoundedCornerShape(20)
),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically // Центрировать вертикально
) {
Text(text = item.name, modifier = Modifier.padding(8.dp))
Text(text = "ID: ${item.quantity}", modifier = Modifier.padding(8.dp))
Row( modifier = Modifier
.padding(8.dp)) {
IconButton(
onClick = onEditClick,
) {
Icon(imageVector = Icons.Default.Edit, contentDescription = null)
}
IconButton(
onClick = onDeleteClick,
) {
Icon(imageVector = Icons.Default.Delete, contentDescription = null)
}
}
}
}
@Composable
fun ShoppingItemEditor(item: ShoppingItem,onEditComplete: (String, Int) -> Unit) {
var editedName by remember { mutableStateOf(item.name) }
var editedQuantity by remember { mutableStateOf(item.quantity.toString()) }
var isEditing by remember { mutableStateOf(item.isEditing) }
Row(
modifier = Modifier
.fillMaxWidth()
.background(Color.White)
.padding(8.dp),
horizontalArrangement = Arrangement.SpaceEvenly
) {
Column {
BasicTextField(
value = editedName,
onValueChange = { editedName = it },
singleLine = true,
modifier = Modifier
.wrapContentSize()
.padding(8.dp)
)
BasicTextField(
value = editedQuantity,
onValueChange = { editedQuantity = it },
singleLine = true,
modifier = Modifier
.wrapContentSize()
.padding(8.dp)
)
}
Button(
onClick = {
isEditing = false
onEditComplete(editedName, editedQuantity.toIntOrNull() ?: 1)
}
) {
Текст («Сохранить»)
}
}
}
@Preview
@Composable
fun ListPreview() {
ListApp()
}
проходить Jetpack Compose из LazyColumn Осуществленный список функций витрины,использовать AlertDialog Реализовано взаимодействие с всплывающими окнами, позволяющее пользователям динамически добавлять, редактировать и удалять записи.
Material3 Предоставляет современные характеристики дизайна, такие как кнопки, текстовые поля и всплывающие окна.
Подобные функции абстрагируются в повторно используемые компоненты.,Например ListItem и ShoppingItemEditor.,Сделайте код простым,И те же компоненты удобно повторно использовать в других демках. так,Модульность кода упрощает обслуживание и расширение в будущем.
Для разработки демо Jetpack Compose значительно упрощен Android Разработка UI писать статус управления работой. использовать LazyColumn Осуществленный Эффективныйизсписоквыставка,проходить State и MutableState Осуществленный UI иданныеиз Синхронные обновления。Material3 Это обеспечивает наше приложение современным языком визуального дизайна. Для разработчиков это CURD Приложение списка — очень распространенный сценарий, и его можно освоить. Compose серединаиз основных функций, таких как LazyColumn Список, управление статусами, взаимодействие со всплывающими окнами и т. д.
Не стесняйтесь задавать любые вопросы, спасибо всем, кто дочитал)