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.

Cómo obtener los datos del repositorio utilizando el ViewModel.

Al usar Repository, me gustaría obtener datos de una API usando ViewModel.

Sin embargo, no entiendo cómo configurar el ViewModel para obtener los datos. Avíseme si lo estoy haciendo bien al ver mi código. Además, sería buena una recomendación de aprendizaje, por eso no puedo entenderlo. ¿Necesito mejorar mis habilidades básicas de codificación?

Este es el AppModule

@Module
@InstallIn(SingletonComponent::class)
object AppModule { 

@Provides
@Singleton
fun providesPokemonRepository(
    api: MovieApiService
) = MovieRepository(api)

@Singleton
@Provides
fun providesMovieApi(): MovieApiService {
    return Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(MovieApiService::class.java)
}

}

Este es el repositorio

class MovieRepository @Inject constructor(private val api: MovieApiService) {

suspend fun getMovieLists(): Resource<><moviesitem>> {
    val response = try {
        api.getMovies()
    } catch (e: Exception) {
        return Resource.Error("Ocurrió un error desconocido")
    }
    return Resource.Success(response)
}

}

Este es el ViewModel que estoy tratando de configurar
“`kotlin
@HiltViewModel
class MovieViewModel @Inject constructor(private val repository: MovieRepository) : ViewModel() {

var response: List<moviesitem> by mutableStateOf(listOf())
val errorMessage: String by mutableStateOf("")
val isLoading = mutableStateOf(false)

fun getMovies() = viewModelScope.launch {
val result = repository.getMovieLists()

}

}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código en general se ve bien, pero hay algunos cambios menores que se pueden hacer para mejorarlo. En el MovieViewModel, puedes actualizar la función getMovies() para actualizar las variables response y errorMessage en función del resultado de la llamada a la API. También debes establecer isLoading en true antes de realizar la llamada a la API y establecerlo en false una vez que se completa la llamada. Aquí está la versión actualizada del MovieViewModel:

    @HiltViewModel
    class MovieViewModel @Inject constructor(private val repository: MovieRepository) : ViewModel() {
    
        var response: List<moviesitem> by mutableStateOf(listOf())
        val errorMessage: String by mutableStateOf("")
        val isLoading = mutableStateOf(false)
    
        fun getMovies() = viewModelScope.launch {
            isLoading.value = true
            val result = repository.getMovieLists()
            isLoading.value = false
    
            when(result) {
                is Resource.Success -> {
                    response = result.data
                    errorMessage = ""
                }
                is Resource.Error -> {
                    response = emptyList()
                    errorMessage = result.message
                }
            }
        }
    }
    

    En cuanto a las recomendaciones de aprendizaje, siempre es útil estar al día con las últimas tendencias y mejores prácticas de desarrollo de Kotlin y Android. Puedes consultar la documentación de Kotlin y la documentación oficial de Android para empezar. Practica la codificación, explora diferentes bibliotecas y herramientas, y participa en foros y comunidades en línea para mejorar tus habilidades.

Comments are closed.