Navigieren von einem Bildschirm zum anderen mit parametrisierten serialisierbaren Datenklassen [Duplikat]Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Navigieren von einem Bildschirm zum anderen mit parametrisierten serialisierbaren Datenklassen [Duplikat]

Post by Anonymous »

Ich verwende das Navigationsdiagramm mit serialisierbaren Objekten und Datenklassen, um einen Bildschirm auf einen anderen zu geben. Ich benutze das One ActivTiy -Muster und alle meine ViewModels sind mit dem Griff auf ihre Wiederholungsbildschirme gesammelt. Ich habe gesehen, dass ich das ohne Probleme tun kann, wenn ich vom Anmeldebildschirm zum Startbildschirm navigiere. Sam zum Spitznamenbildschirm. Wenn ich vom Spitznamen nach Hause gehe, bekomme ich den Fehler: < /p>

Code: Select all

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>
Jetzt habe ich alles in meinem Modul und in meinem Modul und in meinen Bibliotheken korrekt implementiert und alle Abhängigkeiten sind sehr gut integriert, Ursache Navigation funktionieren, aber ich habe das lästige Ding beobachtet, dass ich, wenn ich den Popupto entferte, wenn ich aus dem Spitznamen navigiere Zu Hause funktioniert es gut. Ich habe keine Orte zu fragen, KI ist auch nicht sehr hilfreich.  >@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
)
}
)
}
}
}
}
}
}
Spitzname -Bildschirm

Code: Select all

@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)
)
}
}
}
}
}
Navigationsobjekte

Code: Select all

//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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post