我需要将 @Inject
构造函数 activity
和 fragmentManager
放入我的 Navigator.class
中。但是我收到了这个错误:
AppCompatActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method.
我在 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
最佳答案
首先,请确认understand what the error means .您正在尝试注入(inject) AppCompatActivity
,但 Dagger 提示说无法提供。到目前为止,一切都很好。请始终确保包含链接中显示的完整错误,以便我们可以更轻松地了解发生了什么。在您的情况下,这似乎是一个范围界定问题。
您通过构造函数注入(inject)提供一个 Navigator 作为 @Singleton
...
@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
private val fragmentManager: FragmentManager)
并且您从具有 @PerActivity
范围的模块提供/绑定(bind) AppCompatActivity
。
@Binds
@PerActivity
abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity
所以除非你有一个非常疯狂的设置,否则 @Singleton
将无法访问 @PerActivity
。如果可能的话,你至少会有内存泄漏,因为你会让你的 Activity 实例保持比它的生命周期更长的时间(onCreate -> onDestroy
)
要解决您的问题,您必须将 Navigator
的范围向下移动到 @PerActivity
并共享它引用的 Activity 的生命周期(这样它就不会t 泄漏)或者你必须在你的构造函数中删除对你的 Activity 的依赖。如果您确实需要它是 @Singleton
并引用一个 Activity,您可以为当前 Activity 设置一个 setter,但同样要注意泄漏。
关于android - 如何将 Activity 注入(inject)另一个类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084665/