Search code examples
androidkotlindependency-injectiondagger-hilt

Hilt Inject ActivityComponent dependency into ViewModel


I'm newbie with Hilt and have basic question.

Input data: I have an AppNavigator that used NavController under the hood

class AppNavigatorImpl @Inject constructor(
    private val activity: FragmentActivity
) : AppNavigator {

    private val navController: NavController by lazy {
        val navigationFragment = activity.supportFragmentManager.findFragmentById(R.id.main_navigation_fragment) as NavHostFragment
        navigationFragment.navController
    }

    override fun navigate(payload: NavigationPayload) {
        when (payload) {
            is NavigationPayload.DeepLink -> {
                navController.navigate(payload.link.toUri())
            }
        }
    }
}

I created ActivityComponent NavigationModule:

@Module
@InstallIn(ActivityComponent::class)
abstract class NavigationModule {

    @Binds
    abstract fun bindAppNavigator(impl: AppNavigatorImpl): AppNavigator

}

And I want to make this:

@HiltViewModel
class LocationViewModel @Inject constructor(
    private val appNavigator: AppNavigator
) : ViewModel() {

    fun navigateToPurchase() {
        appNavigator.navigate(NavigationPayload.DeepLink("some_deep_link"))
    }
}

I got a compilation error:

[Dagger/MissingBinding] com.wul.carassistant.domain_common.navigation.AppNavigator cannot be provided without an @Provides-annotated method.

As I understand it's happens because this AppNavigator dependency is ActivityComponent but not ViewModelComponent.

Is there any way to make this AppNavigator injected to ViewModel in a "pretty way"?


Solution

  • You need to add a function that will provide your FragmentActivity. Are you sure you wan to add activity as dependency to your classes?

    @Module
    @InstallIn(ActivityComponent::class)
    class MyFragmentActivityModule {
    
        @Provides
        fun provideFragmentActivity(@ActivityContext activity: Context) : FragmentActivity{
        return activity as FragmentActivity
     } 
    
    }