Код доступен. здесь:
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)
}
}
}
Код: Выделить всё
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
Мобильная версия