Проблема с отображением: пустое текстовое поле, хотя значение существует в базе данных. ⇐ Android
-
Гость
Проблема с отображением: пустое текстовое поле, хотя значение существует в базе данных.
"Я использую Room для сохранения данных. Все работает нормально, за исключением этого составного элемента: 'TextFieldOptionList'. Функциональность раскрывающегося меню работает нормально. Когда пользователь нажимает один из элементов, меню закрывается, и значение появляется в текстовом поле. Затем, если пользователь решит сохранить, нажав 'FloatingActionButton', значения будут правильно отправлены в 'firstSocialCategory' в базу данных (я проверил с помощью инспектора приложений).
Проблема возникает при нажатии на карточку персонажа. Когда я перехожу на страницу 'CharacterSheetScreen', во всех полях отображаются значения, хранящиеся в базе данных, за исключением 'TextFieldOptionList', который пуст, хотя база данных содержит сохраненное значение."
объект HomeScreenDestination : NavigationDestination { переопределить val маршрут = "character_screen" переопределить val titleRes = "ПЕРСОНАЛЫ MES" } @OptIn(ExperimentalMaterial3Api::class) @Композитный забавный домашний экран( модификатор: Модификатор = Модификатор, NavigationToAddCharacter: (String, String) -> Единица измерения, NavigationToEditCharacter: (Int) -> Единица измерения, homeViewModel: HomeViewModel = viewModel (фабрика = AppViewModelProvider.Factory) ) { val homeUiState с помощью homeViewModel.homeUiState.collectAsState() var isAdding, запомнив {mutableStateOf(false) } val ScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() val coroutineScope = RememberCoroutineScope() Строительные леса( модификатор = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), топБар = { DeuxDesSixTopAppBar( заголовок = HomeScreenDestination.titleRes, canNavigateBack = ложь ) }, floatActionButton = { Кнопка ПлавающегоДействия( onClick = { isAdding = правда }, форма = MaterialTheme.shapes.medium, ) { Икона( imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.add_character_content_description) ) } } ) {innerPadding -> если (isAdding) { ДобавитьCharacterDialog( onConfirmClick = { coroutineScope.launch { NavigationToAddCharacter(it.name, it.level) } }, onCancel = { isAdding = false } ) } Тело персонажа( список символов = homeUiState.Список символов, onCharacterClick = NavigationToEditCharacter, onDeleteClick = {символ -> homeViewModel.deleteCharacter(символ) }, модификатор = Модификатор .padding(innerPadding) .fillMaxSize() ) } } @Композитный забавная форма ввода символов( модификатор: Модификатор = Модификатор, Детали персонажа: Детали персонажа, onValueChange: (CharacterDetails) -> Единица ) { Столбец( модификатор = модификатор .fillMaxWidth() .verticalScroll(rememberScrollState()), HorizontalAlignment = Alignment.CenterHorizontally, ) { Ряд { TextFieldCharacterInput( значение =characterDetails.exp, onValueChange = { onValueChange(characterDetails.copy(exp = it)) }, label = "XP ACQUIS", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails.expStage, onValueChange = { onValueChange(characterDetails.copy(expStage = it)) }, label = "ПАЛИЕР", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение =characterDetails.age, onValueChange = { onValueChange(characterDetails.copy(age = it)) }, метка = "ВОЗРАСТ", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение = символДетали.высота, onValueChange = { onValueChange(characterDetails.copy(height = it)) }, метка = "ТАЙЛЕ", заполнитель = "в см", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение = символДетали.вес, onValueChange = { onValueChange(characterDetails.copy(weight = it)) }, метка = "POIDS", заполнитель = "в кг", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение =characterDetails.firstJob, onValueChange = { onValueChange(characterDetails.copy(firstJob = it)) }, label = "МЕТЬЕ 1", модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails. SecondJob, onValueChange = { onValueChange(characterDetails.copy( SecondJob = it)) }, label = "МЕТЬЕ 2", модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) TextFieldOptionList( optionList = социальнаяКатегория, optionValue =characterDetails.firstSocialCategory, onChangeValue = { onValueChange(characterDetails.copy(firstSocialCategory = it)) }, label = "КАТ. СОЦИАЛЬНАЯ 1" ) Spacer(модификатор = Modifier.height(10.dp)) TextFieldOptionList( optionList = социальнаяКатегория, optionValue =characterDetails. SecondSocialCategory, onChangeValue = { onValueChange(characterDetails.copy( SecondSocialCategory = it)) }, метка = "КАТ. СОЦИАЛЬНАЯ 2" ) Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение = символДетали.порядок, onValueChange = { onValueChange(characterDetails.copy(order = it)) }, метка = "ОРДРЕ", модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails.religion, onValueChange = { onValueChange(characterDetails.copy(religion = it)) }, метка = "РЕЛИГИЯ", модификатор = Modifier.weight(1f) ) } } } объект CharacterSheetScreenDestination : NavigationDestination { переопределить val маршрут = "edit_character" переопределить val titleRes = "MON PERSONNAGE" const val idArg = "character_id" val RouteWithIdArg = "$route/{$idArg}" } @OptIn(ExperimentalMaterial3Api::class) @Композитный забавный FeatureSheetScreen( модификатор: Модификатор = Модификатор, onNavigateUp : () -> Единица измерения, characterSheetViewModel: CharacterSheetViewModel = viewModel(фабрика = AppViewModelProvider.Factory) ) { val coroutineScope = RememberCoroutineScope() val ScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() var selectedImageUri, запомнив {mutableStateOf(null) } val singlePhotoPickerLauncher = RememberLauncherForActivityResult( контракт = ActivityResultContracts.PickVisualMedia(), onResult = { uri -> selectedImageUri = uri characterSheetViewModel.updateUiState( characterSheetViewModel.uiState.characterDetails.copy( imageCharacter = selectedImageUri ) ) } ) Строительные леса( модификатор = модификатор .nestedScroll(scrollBehavior.nestedScrollConnection), топБар = { DeuxDesSixTopAppBar( title =characterSheetViewModel.uiState.characterDetails.name, canNavigateBack = правда, NavigationUp = onNavigateUp ) }, floatActionButton = { Кнопка ПлавающегоДействия( onClick = { coroutineScope.launch { характерSheetViewModel.updateCharacter() } } ) { Икона( imageVector = Значки.По умолчанию.Сохранить, contentDescription = "Изменить своего персонажа" ) } } ) {innerPadding -> Столбец( модификатор = Модификатор .fillMaxWidth() .padding(innerPadding), HorizontalAlignment = Alignment.CenterHorizontally ) { ЗаголовокCharacterScreen( imageSelected =characterSheetViewModel.uiState.characterDetails.imageCharacter, onClickIconAddImage = { SinglePhotoPickerLauncher.launch( Пиквисуалмедиарекуест( ActivityResultContracts.PickVisualMedia.ImageOnly ) ) }, уровень =characterSheetViewModel.uiState.characterDetails.level ) ФормаВвода Персонажа( characterDetails =characterSheetViewModel.uiState.characterDetails, onValueChange =characterSheetViewModel::updateUiState, модификатор = Modifier.padding(20.dp) ) } } }
"Я использую Room для сохранения данных. Все работает нормально, за исключением этого составного элемента: 'TextFieldOptionList'. Функциональность раскрывающегося меню работает нормально. Когда пользователь нажимает один из элементов, меню закрывается, и значение появляется в текстовом поле. Затем, если пользователь решит сохранить, нажав 'FloatingActionButton', значения будут правильно отправлены в 'firstSocialCategory' в базу данных (я проверил с помощью инспектора приложений).
Проблема возникает при нажатии на карточку персонажа. Когда я перехожу на страницу 'CharacterSheetScreen', во всех полях отображаются значения, хранящиеся в базе данных, за исключением 'TextFieldOptionList', который пуст, хотя база данных содержит сохраненное значение."
объект HomeScreenDestination : NavigationDestination { переопределить val маршрут = "character_screen" переопределить val titleRes = "ПЕРСОНАЛЫ MES" } @OptIn(ExperimentalMaterial3Api::class) @Композитный забавный домашний экран( модификатор: Модификатор = Модификатор, NavigationToAddCharacter: (String, String) -> Единица измерения, NavigationToEditCharacter: (Int) -> Единица измерения, homeViewModel: HomeViewModel = viewModel (фабрика = AppViewModelProvider.Factory) ) { val homeUiState с помощью homeViewModel.homeUiState.collectAsState() var isAdding, запомнив {mutableStateOf(false) } val ScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() val coroutineScope = RememberCoroutineScope() Строительные леса( модификатор = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), топБар = { DeuxDesSixTopAppBar( заголовок = HomeScreenDestination.titleRes, canNavigateBack = ложь ) }, floatActionButton = { Кнопка ПлавающегоДействия( onClick = { isAdding = правда }, форма = MaterialTheme.shapes.medium, ) { Икона( imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.add_character_content_description) ) } } ) {innerPadding -> если (isAdding) { ДобавитьCharacterDialog( onConfirmClick = { coroutineScope.launch { NavigationToAddCharacter(it.name, it.level) } }, onCancel = { isAdding = false } ) } Тело персонажа( список символов = homeUiState.Список символов, onCharacterClick = NavigationToEditCharacter, onDeleteClick = {символ -> homeViewModel.deleteCharacter(символ) }, модификатор = Модификатор .padding(innerPadding) .fillMaxSize() ) } } @Композитный забавная форма ввода символов( модификатор: Модификатор = Модификатор, Детали персонажа: Детали персонажа, onValueChange: (CharacterDetails) -> Единица ) { Столбец( модификатор = модификатор .fillMaxWidth() .verticalScroll(rememberScrollState()), HorizontalAlignment = Alignment.CenterHorizontally, ) { Ряд { TextFieldCharacterInput( значение =characterDetails.exp, onValueChange = { onValueChange(characterDetails.copy(exp = it)) }, label = "XP ACQUIS", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails.expStage, onValueChange = { onValueChange(characterDetails.copy(expStage = it)) }, label = "ПАЛИЕР", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение =characterDetails.age, onValueChange = { onValueChange(characterDetails.copy(age = it)) }, метка = "ВОЗРАСТ", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение = символДетали.высота, onValueChange = { onValueChange(characterDetails.copy(height = it)) }, метка = "ТАЙЛЕ", заполнитель = "в см", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение = символДетали.вес, onValueChange = { onValueChange(characterDetails.copy(weight = it)) }, метка = "POIDS", заполнитель = "в кг", ТипКлавиатуры = ТипКлавиатуры.Номер, модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение =characterDetails.firstJob, onValueChange = { onValueChange(characterDetails.copy(firstJob = it)) }, label = "МЕТЬЕ 1", модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails. SecondJob, onValueChange = { onValueChange(characterDetails.copy( SecondJob = it)) }, label = "МЕТЬЕ 2", модификатор = Modifier.weight(1f) ) } Spacer(модификатор = Modifier.height(10.dp)) TextFieldOptionList( optionList = социальнаяКатегория, optionValue =characterDetails.firstSocialCategory, onChangeValue = { onValueChange(characterDetails.copy(firstSocialCategory = it)) }, label = "КАТ. СОЦИАЛЬНАЯ 1" ) Spacer(модификатор = Modifier.height(10.dp)) TextFieldOptionList( optionList = социальнаяКатегория, optionValue =characterDetails. SecondSocialCategory, onChangeValue = { onValueChange(characterDetails.copy( SecondSocialCategory = it)) }, метка = "КАТ. СОЦИАЛЬНАЯ 2" ) Spacer(модификатор = Modifier.height(10.dp)) Ряд { TextFieldCharacterInput( значение = символДетали.порядок, onValueChange = { onValueChange(characterDetails.copy(order = it)) }, метка = "ОРДРЕ", модификатор = Modifier.weight(1f) ) Spacer(модификатор = Modifier.width(10.dp)) TextFieldCharacterInput( значение =characterDetails.religion, onValueChange = { onValueChange(characterDetails.copy(religion = it)) }, метка = "РЕЛИГИЯ", модификатор = Modifier.weight(1f) ) } } } объект CharacterSheetScreenDestination : NavigationDestination { переопределить val маршрут = "edit_character" переопределить val titleRes = "MON PERSONNAGE" const val idArg = "character_id" val RouteWithIdArg = "$route/{$idArg}" } @OptIn(ExperimentalMaterial3Api::class) @Композитный забавный FeatureSheetScreen( модификатор: Модификатор = Модификатор, onNavigateUp : () -> Единица измерения, characterSheetViewModel: CharacterSheetViewModel = viewModel(фабрика = AppViewModelProvider.Factory) ) { val coroutineScope = RememberCoroutineScope() val ScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() var selectedImageUri, запомнив {mutableStateOf(null) } val singlePhotoPickerLauncher = RememberLauncherForActivityResult( контракт = ActivityResultContracts.PickVisualMedia(), onResult = { uri -> selectedImageUri = uri characterSheetViewModel.updateUiState( characterSheetViewModel.uiState.characterDetails.copy( imageCharacter = selectedImageUri ) ) } ) Строительные леса( модификатор = модификатор .nestedScroll(scrollBehavior.nestedScrollConnection), топБар = { DeuxDesSixTopAppBar( title =characterSheetViewModel.uiState.characterDetails.name, canNavigateBack = правда, NavigationUp = onNavigateUp ) }, floatActionButton = { Кнопка ПлавающегоДействия( onClick = { coroutineScope.launch { характерSheetViewModel.updateCharacter() } } ) { Икона( imageVector = Значки.По умолчанию.Сохранить, contentDescription = "Изменить своего персонажа" ) } } ) {innerPadding -> Столбец( модификатор = Модификатор .fillMaxWidth() .padding(innerPadding), HorizontalAlignment = Alignment.CenterHorizontally ) { ЗаголовокCharacterScreen( imageSelected =characterSheetViewModel.uiState.characterDetails.imageCharacter, onClickIconAddImage = { SinglePhotoPickerLauncher.launch( Пиквисуалмедиарекуест( ActivityResultContracts.PickVisualMedia.ImageOnly ) ) }, уровень =characterSheetViewModel.uiState.characterDetails.level ) ФормаВвода Персонажа( characterDetails =characterSheetViewModel.uiState.characterDetails, onValueChange =characterSheetViewModel::updateUiState, модификатор = Modifier.padding(20.dp) ) } } }
Мобильная версия