es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EstadoMutable se actualiza en el modelo de vista pero no tiene efecto en @Compose.

Tengo un mutableStateof en mi HiltViewModel llamado loading. Estoy actualizando el valor de loading desde una función en el viewModel que se está pasando a @composable function y se está usando allí.

El caso es que el valor de loading se está actualizando perfectamente en el viewModel pero no se refleja en @Composable function.

Mi viewModel es:

@HiltViewModel
class AuthenticationViewModel @Inject constructor(
    private val repository: AppRepository,
    application: Application
): ViewModel() {
   val loading = mutableStateOf(false)

fun update() = viewModelScope.launch {
      loading.value = true
   }
}

el valor de carga se actualiza aquí pero no se refleja en el @composable

@Composable
fun LoginScreen(
    viewModel: AuthenticationViewModel,
    actions: MainActions
) {
    val loading = viewModel.loading.value

//Loading es otra función componible donde se pasa el valor bool
Loading(state = loading)
CustomNavigationButton(title = "Iniciar sesión", enabled = true, onClick = 
{viewModel.update()})


}

Ahora, cuando hago clic en el botón de navegación, se llama a la función del viewModel y el estado de carga también se está actualizando, pero no se refleja de vuelta en @Composable

La función componible Loading es:

@Composable
fun Loading(state:Boolean) {
    var showDialog by remember { mutableStateOf(state) }

if(showDialog){
    Dialog(onDismissRequest = { showDialog = false }, DialogProperties(
        dismissOnBackPress = false,dismissOnClickOutside = false
    )) {
        Box(
            modifier = Modifier.size(100.dp).background(Color.White, shape = RoundedCornerShape(8.dp)),
            contentAlignment= Alignment.Center,
        ){
            CircularProgressIndicator()
        }
    }
}


}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el valor de loading no se está actualizando en la función @Composable. Para solucionar esto, puedes utilizar la función remember para almacenar el valor de loading en la función @Composable. Esto asegurará que el valor de loading se actualice cada vez que cambie en el ViewModel.

    @Composable
    fun LoginScreen(
        viewModel: AuthenticationViewModel,
        actions: MainActions
    ) {
        var loading by remember { viewModel.loading.value }
    
        //Loading es otra función @Composable donde se pasa un valor bool
        Loading(state = loading)
        CustomNavigationButton(title = "Iniciar sesión",enabled = true,onClick = 
        {viewModel.update()})
    }
    

Comments are closed.