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"?
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
}
}