Я пытаюсь отправить идентификатор одного из моих объектов с одного экрана на другой, но не знаю, почему он не получает правильный идентификатор. Когда я отдельно попытался понять концепцию навигации и создал небольшое приложение, оно заработало. Это маленькое приложение было таким
@Entity
data class MailLayoutItem(
@PrimaryKey(autoGenerate = true)
val id : Int = 0,
val icon : Int,
val sender : String,
val receiver : String,
val subject : String,
val content : String,
val time : String,
val isFavoriteClicked : Boolean
)
Я использовал журналирование, поэтому делюсь некоторыми важными записями журнала, касающимися этой проблемы
"
2024-09-22 11:11:57.657 12290-12290 ProfileScreen com.example.gmailappclone D Переход к ShowMailScreen с идентификатором: 2
2024-09-22 11:11:57.658 12290-12290 MAIL_LAYOUT_SCREEN com.example.gmailappclone D Переход к ShowMailScreen с идентификатором: 2
2024-09-22 11:11:57.703 12290-12290 SHOW_MAIL_SCREEN com.example.gmailappclone D Получено письмо с идентификатором: 0
"
Смиренно прошу вас помочь мне разобраться, почему в моем проекте не работает логика навигации.>
Я пытаюсь отправить идентификатор одного из моих объектов с одного экрана на другой, но не знаю, почему он не получает правильный идентификатор. Когда я отдельно попытался понять концепцию навигации и создал небольшое приложение, оно заработало. Это маленькое приложение было таким [code]@Composable fun ScreenOne(onClick : (Int) -> Unit){ val number = 34 Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Button(onClick = { onClick(number) }) { Text(text = "Navigate") } } } [/code] [code]@Composable fun ScreenTwo(number:Int){ Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text = "Got number : $number") } } [/code] [code]@Composable fun MyApp(modifier: Modifier = Modifier){ val navController = rememberNavController() NavHost(navController = navController, startDestination = "a"){ composable("a") { ScreenOne { num-> navController.navigate("b/${num}") } } composable("b/{num}") { navBackStackEntry -> val number = navBackStackEntry.arguments?.getString("num")?.toIntOrNull() ?: 0 ScreenTwo(number = number) } } } [/code] [code] class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { PracticingNavigationTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> MyApp(Modifier.padding(innerPadding)) } } } } } [/code] Но я не знаю, почему эта же логика не работает в моем основном проекте. Я поделюсь файлами кода основного проекта
p> [list] [*]Экран профиля (Экран, с которого я делился идентификатором) -> [/list] [code]@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( onFabClicked : () -> Unit, onMailClicked: (Int) -> Unit, profileScreenViewModel: ProfileScreenViewModel ) {
val TAG = "ProfileScreen" val mailList by profileScreenViewModel.mailLayoutList.observeAsState(emptyList())
Log.d(TAG,"Size is : ${mailList.size}") val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() val bottomSheetState = rememberModalBottomSheetState( skipPartiallyExpanded = false
) var showSheet by remember { mutableStateOf(false) }
//Track if FAB is extended var isExtended by remember { mutableStateOf(false) }
Box ( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { detectVerticalDragGestures { _, dragAmount -> //Detect swipe up or down if (dragAmount < 0) { //Swiped Up isExtended = true } else if (dragAmount > 0) { // Swiped down isExtended = false } } } ) {
ModalNavigationDrawer( drawerState = drawerState, // Use ModalDrawer's state drawerContent = { DrawerItemUiLayout() // Drawer content }, gesturesEnabled = true, // Allow gestures to open/close the drawer scrimColor = Color.Black.copy(alpha = 0.32f) // Scrim with dimming effect ) {
} [/code] [list] [*]ShowMailScreen (THIS получит идентификатор)-> [/list] [code]@OptIn(ExperimentalFoundationApi::class) @Composable fun ShowMailScreen( onBackButtonClicked: () -> Unit, onUnreadMailClicked: () -> Unit, profileScreenViewModel: ProfileScreenViewModel, mailId: Int ) { val TAG = "SHOW_MAIL_SCREEN" Log.d(TAG, "Got mail with id: ${mailId}")
var mail : MailLayoutItem = MailLayoutItem( icon = 0, sender = "null", receiver = "null", subject = "null", content = "null", time = "00:00", isFavoriteClicked = false ) LaunchedEffect(mailId) { mail = profileScreenViewModel.findAParticularMail(mailId)
}
var isStarClicked by remember { mutableStateOf(mail.isFavoriteClicked) }
//Sending the clicked mail to other screen to view full mail fun findAParticularMail(mailId: Int): MailLayoutItem { var foundMail: MailLayoutItem = MailLayoutItem( icon = 0, sender = "null", receiver = "null", subject = "null", content = "null", time = "00:00", isFavoriteClicked = false ) viewModelScope.launch { try { allMailsRepository.getSpecificMail(mailId).collect { foundMail = it } } catch (e: Exception) { Log.d(TAG, "Specific mail can't be found with error : ${e.message}") } } // val mail = _mailLayoutList.value?.find { // foundMail-> // foundMail.id == mailId // } return foundMail }
//Adding new mail in list @RequiresApi(Build.VERSION_CODES.O) fun addNewMail(mailLayoutItem: MailLayoutItem) { val currentDateAndTime = LocalDateTime.now(ZoneId.of("Asia/Kolkata")) val formattedTimeOrDate = getDateAndTime.getFormatedTimeOrDate(currentDateAndTime) val newMailLayoutItem = mailLayoutItem.copy(time = formattedTimeOrDate) viewModelScope.launch { try { allMailsRepository.insertMail(newMailLayoutItem) } catch (e: Exception) { Log.d(TAG, "Error occurred while inserting the mail: ${e.message}") } } } } [/code] [list] MailLayout (компонуемый элемент, важный для отправки идентификатора и использования на экране профиля)->
[code]@Composable fun MailLayout( mailLayoutItem: MailLayoutItem, onMailClicked: (Int) -> Unit, profileScreenViewModel: ProfileScreenViewModel ){ val TAG = "MAIL_LAYOUT_SCREEN"
fun truncateString(input:String, maxLength:Int):String{ if (input.length > maxLength){ return input.take(maxLength) + "..." }else{ return input } }
val mailImageBitmap = ImageBitmap.imageResource(id = mailLayoutItem.icon)
Row ( modifier = Modifier .fillMaxWidth() .padding(8.dp) .clickable { onMailClicked( mailLayoutItem.id ) Log.d(TAG, "Navigating to ShowMailScreen with id: ${mailLayoutItem.id}")
[*]Класс данных [/list] [code]@Entity data class MailLayoutItem( @PrimaryKey(autoGenerate = true) val id : Int = 0, val icon : Int, val sender : String, val receiver : String, val subject : String, val content : String, val time : String, val isFavoriteClicked : Boolean )
[/code] Я использовал журналирование, поэтому делюсь некоторыми важными записями журнала, касающимися этой проблемы " [list] [*] 2024-09-22 11:11:57.657 12290-12290 ProfileScreen com.example.gmailappclone D Переход к ShowMailScreen с идентификатором: 2
[*]2024-09-22 11:11:57.658 12290-12290 MAIL_LAYOUT_SCREEN com.example.gmailappclone D Переход к ShowMailScreen с идентификатором: 2
[*] 2024-09-22 11:11:57.703 12290-12290 SHOW_MAIL_SCREEN com.example.gmailappclone D Получено письмо с идентификатором: 0
[/list] " Смиренно прошу вас помочь мне разобраться, почему в моем проекте не работает логика навигации.>
Я пытаюсь отправить идентификатор одного из моих объектов с одного экрана на другой, но не знаю, почему он не получает правильный идентификатор. Когда я отдельно попытался понять концепцию навигации и создал небольшое приложение, оно заработало. Это...
У меня есть df, содержащий столбец целых чисел (0–n, максимум n = 5), который я хотел бы преобразовать в строки из списка (размер равен n). Список будет выглядеть примерно так («малыш», «молодежь», «подросток», ...).
{ approverSpv : { id : 176, isApproved : true }, approverManager : { id : 176, isApproved : true } } And I want to read those Approver id. Here are my Classes
Я не могу сохранить или обновить данные из своего интерфейса, я получаю эту ошибку. У меня есть таблица категорий, таблица элементов и таблица элементов категории (сводная).
Ниже приведен код файла моего контроллера элементов: