如何将活动注入另一堂课

时间:2018-06-28 13:51:34

标签: android dependency-injection kotlin dagger-2

我需要@Inject构造函数activityfragmentManager进入我的Navigator.class。但是我遇到了这个错误:

  

如果没有@Inject构造函数,则无法提供AppCompatActivity或   来自@Provides注释的方法。

我已经阅读了关于Stackoverflow的所有类似问题。我做了他们建议的一切,但没有找到答案。

Navigator.class

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
                                    private val fragmentManager: FragmentManager)

BaseActivity.class

abstract class BaseActivity: AppCompatActivity(), HasSupportFragmentInjector{
    @Inject
    lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
    @Inject
    lateinit var navigator: Navigator
   override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
override fun supportFragmentInjector() = fragmentInjector

BaseModule.class

@Module
abstract class BaseActivityModule {
@Module
companion object {

    @JvmStatic
    @Provides
    @Named(ACTIVITY_FRAGMENT_MANAGER)
    @PerActivity
    fun activityFragmentManager(activity: AppCompatActivity): FragmentManager =
            activity.supportFragmentManager
}

@Binds
@PerActivity
abstract fun activity(appCompatActivity: AppCompatActivity): Activity

@Binds
@PerActivity
abstract fun activityContext(activity: Activity): Context

MainActivityModule.class

@Module(includes = [
    BaseActivityModule::class

])
abstract class MainActivityModule {

    @Binds
    @PerActivity
    abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

AppModule.class

    @Module(includes = [AndroidSupportInjectionModule::class])
abstract class AppModule {
@Binds
@Singleton
abstract fun application(app: App): Application

@PerActivity
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun mainActivityInjector(): MainActivity

1 个答案:

答案 0 :(得分:0)

首先,请确保执行understand what the error means。您正在尝试注入AppCompatActivity,但Dagger抱怨无法提供。到目前为止,一切都很好。请始终确保包含链接中所示的完整错误,以便我们可以更轻松地了解发生了什么。就您而言,这似乎是一个范围界定问题。

您通过构造函数注入将Navigator作为@Singleton ...

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
                                private val fragmentManager: FragmentManager)

然后您从范围为AppCompatActivity的模块中提供/绑定@PerActivity

@Binds
@PerActivity
abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

因此,除非您进行了非常疯狂的设置,否则 @Singleton将无法访问@PerActivity 。如果可能的话,至少会造成内存泄漏,因为您将使Activity实例的生存期超过其生存期(onCreate -> onDestroy


要解决您的问题,您必须将Navigator的范围缩小至@PerActivity,并共享其引用的活动的生命周期(以免泄漏),或者您必须在构造函数中删除对Activity的依赖。如果确实需要将其设置为@Singleton并引用一个活动,则可以为当前活动设置一个设置器,但再次提防泄漏。