Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

220
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda