Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

221
Visualizações
cómo vincular el ciclo de vida de ViewModel para componer

Estoy usando Jetpack Compose ahora. Me di cuenta de que podía tener ViewModel según mi modelo de vista componible e init en componible así:

 val myViewModel:MyViewModel = viewModel()

Pero existe el problema de que estos modelos de vista nunca se destruirán, incluso cuando no se muestre el componible.

por ejemplo, tengo una pantalla componible principal que carga otra pantalla según la interacción del usuario, como esta:

 @Composable fun MainAuthentication(viewModel: MainViewModel) { val state = viewModel.state.value val scope = rememberCoroutineScope() val scaffoldState = rememberScaffoldState() Scaffold(scaffoldState = scaffoldState) { //--------------------(login and sign up button)--------------------// Row( modifier = Modifier .padding(top = 50.dp) .fillMaxSize(), verticalAlignment = Alignment.CenterVertically, ) { if (!state.signUpFormIsVisible && !state.loginFormIsVisible) { Button( onClick = { viewModel.onEvent(event = MainEvent.LoginButtonClick) }, modifier = Modifier .padding(10.dp) .weight(0.5f) ) { Text(text = stringResource(id = R.string.login)) } Button( onClick = { viewModel.onEvent(event = MainEvent.SignUpButtonClick) }, modifier = Modifier .padding(10.dp) .weight(0.5f) ) { Text(text = stringResource(id = R.string.signup)) } } } LoginForm(show = state.loginFormIsVisible) { msg -> scope.launch { scaffoldState.snackbarHostState.showSnackbar( message = msg ) } } SignUpForm(show = state.signUpFormIsVisible) { msg -> scope.launch { scaffoldState.snackbarHostState.showSnackbar( message = msg ) } } } }

cada una de las pantallas de inicio de sesión y registro tiene su modelo de vista y se usa así:

 @Composable fun LoginForm(show: Boolean, snackBarMsg: (String) -> Unit) { val viewModel: LoginViewModel = viewModel() val state = viewModel.state.value ... AnimatedVisibility( visible = show, enter = slideInVertically(), exit = slideOutVertically() ) { ... ... } }

¿Cómo puedo vincular cada modelo de vista a su función componible si el componible no está visible, el modelo de vista se destruye?

¿Es una buena práctica destruir los modelos de vista si el componible respectivo no está visible?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

En Compose, puede usar la navegación , que es perfecta para sus necesidades: cada ruta tiene su propio alcance de modelo de vista, que se destruye tan pronto como la ruta se elimina de la pila posterior de navegación.

Puede usar popBackStack para eliminar la pantalla actual de la pila antes de navegar a la nueva pantalla, la pantalla anterior se destruirá con el modelo de vista correspondiente. Consulte esta respuesta sobre cómo puede eliminar varios elementos.

Compose Navigation se basa en la navegación normal de Android, por lo que su documentación es relevante para la mayoría de las preguntas, en caso de que la documentación de Compose Navigation le parezca corta.

over 4 years ago · Santiago Trujillo Relatório

0

Los ViewModels están destinados a ser independientes de las IU. Si la interfaz de usuario se destruye debido a un cambio de configuración, el modelo de vista debe permanecer intacto y conservar el estado de la interfaz de usuario cuando se recomponga. Vincular un modelo de vista a cada componible no tiene sentido. Normalmente, debería tener solo un modelo de vista por pantalla y todos los componibles en esa pantalla deberían usar ese. Pero esa no es una regla estricta. Ciertamente, hay componibles que pueden y deben tener sus propios modelos de vista. Pero deben administrarse a un nivel superior para que se destruyan cuando la pantalla en la que aparecen ya no esté en uso. Cuando navega desde la pantalla actual a una pantalla anterior usando el botón Atrás, normalmente querrá destruir todos los modelos de vista para esa pantalla.

Hay mejores enfoques sobre cómo los componibles en su jerarquía de interfaz de usuario pueden acceder a los modelos de vista y destruirlos. Desarrollé una solución que administra sus modelos de vista para sus pantallas y permite que los componibles en cualquier lugar dentro de la jerarquía accedan fácilmente a ellos. También existe la característica de que un modelo de vista puede permanecer vivo incluso si la pantalla se destruye cuando regresa a la pantalla anterior. Un caso de uso para esto es si está desarrollando una aplicación que organiza videoconferencias y desea que la cámara y el audio continúen mientras navega hacia atrás sin terminar la reunión. Para esto, el modelo de vista debe permanecer vivo, aunque la pantalla misma haya sido destruida. Jetpack Compose tiene sus propias soluciones pero nunca estuve satisfecho con ellas. Los dos mayores inconvenientes del enfoque nativo son que no puede pasar objetos entre pantallas y necesita escribir código para detectar los ajustes de configuración del dispositivo y los cambios para adaptar la pantalla. Resolví esto con el marco que desarrollé. Échale un vistazo:

https://github.com/JohannBlake/Jetmagic

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda