Представления приложений Jetpack Compose CRUD не обновляютсяAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Представления приложений Jetpack Compose CRUD не обновляются

Сообщение Anonymous »

Я новичок в Android Compose. Обычно я учу свою дочь программированию, и мы решили начать с чего-то, что имеет пользовательский интерфейс, поэтому выбрали для начала Android. Я создал приложение в Jetpack Compose, и у меня возникла непонятная мне ошибка. Все работает как положено, но после того как приложение уходит в фон, оно перестает работать корректно. Приложение простое — простой CRUD в базе данных. Проблема возникает, когда я переключаюсь на другое приложение и возвращаюсь к нему через некоторое время, когда использую другие приложения. Тогда не работают операции создания записи и ее редактирования, а список не обновляется. Я старался придерживаться общих стандартов, которые использую каждый день, таких как внедрение зависимостей, общий макет и т. д. Возможно, мои привычки программирования .NET или React реализованы в Compose по-другому.
Код доступен. здесь:
https://github.com/rnest-technoir/tne-todo
Я пытался создать простое и понятное приложение CRUD. . В приложении есть Koin в качестве DI, модели просмотра и навигации по созданию. Я попытался выполнить отладку и увидел, что вызываются методы добавления и обновления репозитория, но база данных не обновляется. Все происходит когда я возвращаюсь в приложение из фона.
Я вручную тестирую приложение стандартным способом и все хорошо. С другой стороны, когда я использую 3 навигационные клавиши на нижней панели, в частности круглую, и выхожу из приложения, перехожу к другому приложению и запускаю его. Затем я возвращаюсь к отлаженной и пытаюсь отредактировать запись списка, в logcat нет ошибок, и база данных комнаты, несмотря на живое редактирование, остается неизменной, как и список.
Мой навигация выглядит так:

Код: Выделить всё

@Composable
fun AppOutlet(){
val navController = Router.current
NavHost(navController = navController, startDestination = Routes.taskListRoute){
composable(route = Routes.taskListRoute){
TaskListPage()
}
composable(route = Routes.taskAddRoute){
TaskAddPage()
}

composable(route = "${Routes.taskEditRoute}/{taskId}", arguments = listOf(navArgument("taskId") { type = NavType.IntType })){
stack -> TaskEditPage(stack.arguments?.getInt("taskId") ?: 0)
}
}
}
NavController распространяется по всему приложению с помощью функции ComposisionLocal:

Код: Выделить всё

val Router = compositionLocalOf { error("No nav controller!") }
А вот главный экран приложения:

Код: Выделить всё

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainPage(viewModel: SharedViewModel = koinViewModel()) {

CompositionLocalProvider(Router provides rememberNavController()) {

val router = Router.current

LaunchedEffect(Unit) {
viewModel.initialize()
}

BackHandler {
router.navigate(Routes.taskListRoute)
}

Scaffold(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
topBar = {
TopAppBar(
title = { Text(text = "Top bar", color = Color(0xFFFFFFFF)) },
colors = topAppBarColors(containerColor = MaterialTheme.colorScheme.secondary)
)
},
floatingActionButton = {
FloatingActionButton(onClick = { router.navigate(Routes.taskAddRoute) }, shape = CircleShape) {
Icon(Icons.Default.Add, contentDescription = "Add", tint = Color.White)
}
},
) { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding),
verticalArrangement = Arrangement.spacedBy(16.dp),
) {
Column(
modifier = Modifier.padding(10.dp)
) {
// content here
AppOutlet()
}
}
}
}
}
Экран создания задачи

Код: Выделить всё

@Composable
fun TaskAddPage(viewModel: SharedViewModel = koinViewModel()){

val router = Router.current
val context = LocalContext.current

fun handleSubmit(task: TodoTask){
val isValid = viewModel.validateTaskForm(task)
if(!isValid){
Toast.makeText(context, "Invalid form", Toast.LENGTH_SHORT).show()
return
}
viewModel.addTask(task)
router.navigate(Routes.taskListRoute)
}

Surface (
modifier = Modifier
.fillMaxSize()
.padding(20.dp)
) {
Column (
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
TaskForm(null) {
handleSubmit(it)
}
}
}
}
И создадим саму форму:

Код: Выделить всё

@Composable
fun TaskForm(task: TodoTask?, onSubmit: (task: TodoTask) ->  Unit){

var title by rememberSaveable { mutableStateOf(task?.title ?: "") }
var description by rememberSaveable { mutableStateOf(task?.description ?: "") }
var priority by rememberSaveable { mutableStateOf(task?.priority ?: Priority.None) }
var expanded by rememberSaveable { mutableStateOf(false) }

OutlinedTextField(value = title, label = { Text(text = "Title") }, onValueChange = { title = it })

Spacer(modifier = Modifier.height(20.dp))

OutlinedTextField(value = description, label = { Text(text = "Description") }, onValueChange = { description = it })

Spacer(modifier = Modifier.height(20.dp))

Box (
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.TopStart)
) {
Row (
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
Box(modifier = Modifier
.size(20.dp)
.clip(CircleShape)
.background(priority.color))
Text(text = "Select priority")
IconButton(onClick = { expanded = !expanded }) {
Icon(
imageVector = Icons.Default.MoreVert,
contentDescription = "More"
)
}
}
}

Spacer(Modifier.height(10.dp))
Row {
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier,
offset = DpOffset(150.dp, 10.dp)
) {
Priority.entries.map {
DropdownMenuItem(
text = { Text(text = it.name) },
onClick = { priority = it },
leadingIcon = { Box(modifier = Modifier
.size(20.dp)
.clip(CircleShape)
.background(it.color)) }
)
HorizontalDivider()
}
}
}

Spacer(Modifier.height(10.dp))

IconButton(onClick = { onSubmit(TodoTask(title, description, priority, task?.id ?: 0)) }, modifier = Modifier) {
Icon(imageVector = Icons.Default.Save, contentDescription = "Save item", tint = Color.Gray)
}
}
В принципе то же самое и с экраном обновления.
Моей первой мыслью было, что что-то не так с навигацией, но проблема не исчезла, даже когда я исправил код и используемые события при добавлении и создании компонуемых объектов.
Я разрабатываю приложение на Windows 11 Pro, Android Studio Koala и подключении через USB Nubia 7.

Подробнее здесь: https://stackoverflow.com/questions/787 ... nt-refresh
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»