android - 如何将 Activity 注入(inject)另一个类(class)

标签 android dependency-injection kotlin dagger-2

我需要将 @Inject 构造函数 activityfragmentManager 放入我的 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/

相关文章:

Android 控件/布局(Instagram 应用程序如何做到这一点?)

Android:PrintedPdfDocument Resolution 无效

java - 在 Fragment 中实现 RecyclerView

java - 在 Guice 中注入(inject)通用工厂

reflection - 有没有办法从常规的 Kotlin 类中识别出 Kotlin 数据类?

android - Android Room强制通过自动增量值重写属性

android - mediaRecorder 记录最后 X 秒

c# - 统一.WebApi |确保 Controller 有一个无参数的公共(public)构造函数

oop - 依赖倒置原理及组成

kotlin - 检查对象的类是否从特定的密封类继承