Навигация с одного экрана на другой с параметризованными сериализуемыми классами данныхAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Навигация с одного экрана на другой с параметризованными сериализуемыми классами данных

Сообщение Anonymous »

Я использую навигационный навигационный график с сериализуемыми объектами и классами данных, чтобы перейти на один экран на другой. Я использую один аккуратный рисунок, и все мои видовые модели охватывают их повторные экраны с помощью рукояти. Я увидел это, когда я перемещаюсь с экрана входа на домашний экран, я могу сделать это без проблем. Сэм на экране прозвища. Когда я перехожу от прозвища к дому, я получаю ошибку: < /p>
FATAL EXCEPTION: main
Process: com.example.hearty, PID: 23649
kotlinx.serialization.SerializationException: Serializer for class 'Companion' is not found. Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
< /code>
Теперь я правильно реализовал все в своем модуле и библиотеках, и все зависимости очень хорошо интегрированы, вызывает навигационные работы, но я заметил надоедливую вещь, которая, если я удаляю всплывающее количество, когда я перемещаюсь с псевдонима До дома это работает нормально. Я не могу спросить, ИИ тоже не очень полезен. >@Composable
fun LoginScreen(navController: NavController) {
val viewModel = hiltViewModel()
val snackbarHostState = remember { SnackbarHostState() }
val loginResult by viewModel.loginResult.observeAsState()
val nickname by viewModel.nickname.collectAsState()
val formFieldMaxLength = 24
val isOnline = viewModel.isOnline.collectAsState()
val noInternetMessage = stringResource(R.string.snackbarMessageInfo0)

LaunchedEffect(loginResult) {
loginResult?.let {
if(it.message != "") {
if (it.show) {
snackbarHostState.showSnackbar(
message = it.message,
withDismissAction = it.withDismissAction,
duration = it.duration
)
it.show = false
}
}
else{
Log.d("LoginScreen", "$nickname")
if (nickname == ""){
navController.navigate(Nickname(viewModel.idUser.value!!)){
popUpTo(Login){
inclusive = true
}
}
}
else {
navController.navigate(Home(viewModel.idUser.value!!)){
popUpTo(Login){
inclusive = true
}
}
}
}
}
}

LaunchedEffect(nickname) {
nickname?.let{
if (it != " "){
if(it != ""){
navController.navigate(Home(viewModel.idUser.value!!)) {
popUpTo(Login) {
inclusive = true
}
}
}
else{
navController.navigate(Nickname(viewModel.idUser.value!!)) {
popUpTo(Login) {
inclusive = true
}
}
}
}
}
}

LaunchedEffect(isOnline) {
isOnline.value.let{
if (!it){
snackbarHostState.showSnackbar(
message = noInternetMessage,
withDismissAction = true,
duration = SnackbarDuration.Short
)
}
}
}

Scaffold(
modifier = Modifier
.fillMaxSize()
.imePadding(),
containerColor = hearty_theme_light_primary,
snackbarHost = {
SnackbarHost(
hostState = snackbarHostState,
snackbar = { data ->
Snackbar(
snackbarData = data,
containerColor = if (loginResult != null) loginResult!!.color else Color(0)
)
})
}
) {
Column(modifier = Modifier.padding(it)) {

Image(
painter = painterResource(
when (isOnline.value) {
true -> R.drawable.img_login_art
else -> R.drawable.no_internet
}
),
contentDescription = "Login greet art",
modifier = Modifier
.fillMaxWidth()
.padding(all = 15.dp)
.weight(.35f)
)

Surface(
shape = RoundedCornerShape(
topStart = 30.dp,
topEnd = 30.dp,
bottomStart = 30.dp,
bottomEnd = 30.dp
),
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 25.dp)
.padding(bottom = 25.dp)
.weight(.65f),
shadowElevation = 30.dp,
) {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(horizontal = 25.dp)
.padding(top = 25.dp),
verticalArrangement = Arrangement.SpaceBetween
) {
Column(
modifier = Modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
val user = viewModel.getUser()
val pass = viewModel.getPass()

val acceptedRegex = Regex("[\\w*.,?!\\|/-=+@#$%^&()\\[\\]{}]*")

ClearTextField(
user,
acceptedRegex,
{newUsername -> viewModel.updateUser(newUsername)},
R.string.formLoginUsername,
"....."
)

TextFieldSupportMaxLength(
textFieldValue = user,
maxLength = formFieldMaxLength
)

HiddenTextField(
pass,
acceptedRegex,
{newPassword -> viewModel.updatePass(newPassword)},
R.string.formLoginPassword,
"*****"
)

TextFieldSupportMaxLength(
Modifier.fillMaxWidth(),
textFieldValue = pass,
maxLength = formFieldMaxLength
)

MainButtonForm(
{ viewModel.checkCredentials() },
isOnline.value,
stringResource(R.string.buttonLogin).uppercase()
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 25.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
Text(
text = stringResource(R.string.formLoginToRegister),
color = Color.Black,
fontSize = 14.sp,
fontWeight = FontWeight.Normal
)

TextButton(
onClick = { navController.navigate(Register) },
contentPadding = PaddingValues(3.dp),
enabled = isOnline.value,
content = {
Text(
text = stringResource(R.string.buttonRegister).uppercase(),
color = if (isOnline.value) hearty_theme_light_primary
else hearty_theme_button_onInactive,
fontSize = 14.sp,
fontWeight = FontWeight.ExtraBold,
fontStyle = FontStyle.Italic
)
}
)
}
}
}
}
}
}

Экран псевдонима
@Composable
fun NicknameScreen(
navController: NavController){
val viewModel = hiltViewModel()
val snackbarHostState = remember { SnackbarHostState() }
val updateResult by viewModel.updateResult.observeAsState()
val isEnabledProceed by viewModel.isEnabledProceed.collectAsState()
val formFieldMaxLength = 24
val id = navController.currentBackStackEntry?.arguments?.getString("id") ?: ""

LaunchedEffect(updateResult) {
updateResult?.let {
if (it.message != "") {
if (it.show) {
snackbarHostState.showSnackbar(
message = it.message,
withDismissAction = it.withDismissAction,
duration = it.duration
)
it.show = false
}
}
else{
Log.d("NicknameScreen", "USER ID: {${viewModel.id}}")
navController.navigate(Home(viewModel.id)) {
popUpTo(Nickname){
inclusive = true
}
}
}
}
}

Scaffold(
modifier = Modifier
.fillMaxSize()
.imePadding(),
containerColor = hearty_theme_light_primary,
snackbarHost = {
SnackbarHost(
hostState = snackbarHostState,
snackbar = { data ->
Snackbar(
snackbarData = data,
containerColor = updateResult?.color ?: Color(0)
)
})
}
) {
Column(
modifier = Modifier
.padding(it)
.padding(all= 25.dp)
.fillMaxSize(),
verticalArrangement = Arrangement.Center
) {
Surface(
shape = RoundedCornerShape(
topStart = 30.dp,
topEnd = 30.dp,
bottomStart = 30.dp,
bottomEnd = 30.dp
) ) {
Column(modifier = Modifier.padding(all= 25.dp)) {
val nickname = viewModel.nickname.observeAsState()
val acceptedRegex = Regex("[\\w*., ?!'\"|/-=+@#$%^&()\\[\\]{}]*")
Text(
text = stringResource(R.string.formChooseNicknameFormTitle),
fontSize = 24.sp,
color = Color.Black,
fontWeight = FontWeight.ExtraBold,
textAlign = TextAlign.Center,
modifier= Modifier.padding(bottom= 10.dp)
)
ClearTextField(
value = nickname.value!!,
acceptedRegex = acceptedRegex,
onValueChange = { newValue -> viewModel.setNickname(newValue) },
stringResource = R.string.formChooseNickname,
placeholder = ".....",
formFieldMaxLength = formFieldMaxLength
)
TextFieldSupportMaxLength(
textFieldValue = nickname.value!!,
maxLength = formFieldMaxLength
)
MainButtonForm(
{
if(id != ""){
viewModel.checkNickname(id)
}
else{
viewModel.setUpdateResultError(R.string.formNicknameIdError)
}
},
isEnabledProceed,
stringResource(R.string.buttonProceed)
)
}
}
}
}
}

навигационные объекты
//Routes
@Serializable
object Login
@Serializable
object Register
@Serializable
data class Nickname(val id: String? = null)
@Serializable
data class Home(val id: String? = null)
@Serializable
object HomeCookbooks
@Serializable
object HomeCooking
@Serializable
object HomeSearch


Подробнее здесь: https://stackoverflow.com/questions/794 ... data-class
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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