Search code examples
mvvmviewmodelandroid-jetpack-composedagger-hilt

How to inject a ViewModel into a composable function using Hilt (Jetpack Compose)


I'm doing the same as shown in the documentation here. I want to Inject the ViewModel into a Composable function (Screen), but I get this error:

Cannot create an instance of class com.example.blotube.ui.later.LaterViewModel

My ViewModel:

@HiltViewModel
class LaterViewModel @Inject constructor(
    private val database: Database
):ViewModel() {

    val watchLater=database.videos().getAll()

}

My Composable Function (Screen):

@Composable
fun WatchLater(vm: LaterViewModel = viewModel()){


    val videos=vm.watchLater.observeAsState()
    val context= LocalContext.current
    

}

Solution

  • From version androidx.hilt:hilt-navigation-compose:1.0.0-alpha02 you can inject view model into Composable functions by:

    hiltViewModel<ViewModelType>()
    

    Example:

    @Composable 
    fun LoginScreen(viewModel: LoginViewModel) {}
    
    LoginScreen(
        viewModel = hiltViewModel<LoginViewModel>()
    )
    

    Android Developer Documentation compose and hilt

    UPDATE:

    import androidx.hilt.navigation.compose.hiltViewModel
    
    @Composable 
    fun LoginScreen(
        viewModel: LoginViewModel = hiltViewModel()
    ){
       val videos=vm.watchLater.observeAsState()
       val context= LocalContext.current
    }