我需要@Inject
构造函数activity
和fragmentManager
进入我的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
答案 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
并引用一个活动,则可以为当前活动设置一个设置器,但再次提防泄漏。