1

I am using Dagger2 for Dependency Injection in Android I have an Interface named FragmentChangeListener which is Implemented by MainActivity. I am trying to providing the instance of MainActivity by using @Binds Annotation but when I use @Inject fragmentChagneListener in fragment it gives me Error error: [Dagger/MissingBinding] listeners.FragmentChangeListener cannot be provided without an @Provides-annotated method.

@Module
abstract class MainActivityModule {

@Module
companion object{
    @Provides
    @MainActivityScope
    @JvmStatic
    fun provideMainRepo(apiRequest: ApiRequest):MainActivityRepo{
        return MainActivityRepo(apiRequest)
    }
    @Provides
    @MainActivityScope
    @JvmStatic
    fun provideFragmentManager(mainActivity: MainActivity): 
FragmentManager {
        return mainActivity.supportFragmentManager
    }
}

@Binds
abstract fun bindFragmentChangeListener(mainActivity: MainActivity): 
FragmentChangeListener

}


abstract class ActivitiesModuleInjector {


@MainActivityScope
@ContributesAndroidInjector(
    modules = [
        MainActivityModule::class
    ]
)
abstract fun provideMainActivity():MainActivity

@ContributesAndroidInjector
abstract fun provideBaseActivity():BaseActivity

@SignInScope
@ContributesAndroidInjector(
    modules = [
        SignInModule::class
    ]
)
abstract fun providesSignInActivity():SignInActivity

@SplashScope
@ContributesAndroidInjector
abstract fun provideSplash(): Splash

}


class MainActivity: BaseActivity() ,FragmentChangeListener{



@Inject
@MainActivityScope
lateinit var fragmentManager: FragmentManager

lateinit var fragmentTransaction:FragmentTransaction


lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding=DataBindingUtil.setContentView(this,R.layout.activity_main)

}



override fun onFragmentChange(fragment: Fragment, bundle: Bundle?) {
    fragment.arguments = bundle
    fragmentTransaction = fragmentManager.beginTransaction()
    fragmentTransaction.add(R.id.containerMainActivity,fragment)
    fragmentTransaction.addToBackStack(null)
    fragmentTransaction.commit()
}

}


@Module
abstract class FragmentsModuleInjector {


@ContributesAndroidInjector
abstract fun provideBaseFragment():BaseFragment

@AddRideScope
@ContributesAndroidInjector(
    modules = [AddRideModule::class]
)
abstract fun provideAddRideFragment():AddRide
}

class AddRide : BaseFragment() {

lateinit var rideBiding: FragmentAddRideBinding
@Inject
lateinit var fragmentChangeListener: FragmentChangeListener
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    rideBiding=DataBindingUtil.inflate<ViewDataBinding>(
        inflater,
        R.layout.fragment_add_ride,
        container,false) as FragmentAddRideBinding
    return rideBiding.root
}
}
Ganger
  • 91
  • 3
  • 10
  • Please see [here](https://stackoverflow.com/q/44912080/1837367) for some general information and troubleshooting. It seems like your Fragment-Component is not a subcomponent of your MainActivity-Component, thus there is no way it could access the binding. – David Medenjak Sep 29 '19 at 07:37
  • You should not inject an activity with Dagger. But if you need to, have a look at `ContributesAndroidInjector`. – tynn Sep 29 '19 at 08:54
  • Hey tynn what changes i need to do in ContributesAndroidInjector. I am using ContributesAndroidInjector for MainActivity and i guess its injecting MainActivity but when i use @Inject fragmentChangeListener it gives me Error.. – Ganger Sep 29 '19 at 09:03
  • @tynn what are you talking about? Surely you can inject an Activity if you want, that's what `void inject(...` is for. – EpicPandaForce Oct 02 '19 at 16:51

0 Answers0