【问题标题】:ContributesAndroidInjector does not inject moduleContributesAndroidInjector 不注入模块
【发布时间】:2019-02-18 19:21:17
【问题描述】:

我一直在尝试 dagger2 的基本实现,但由于某种原因 ContributesAndroidInjector 没有注入定义的模块。运行应用程序时出现以下错误

错误

error: [Dagger/MissingBinding] com.demo.MainPresenter cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent {
                ^
  A binding with matching key exists in component: com.demo.di.MainActivityModule_ProvidesMainActivity.MainActivitySubcomponent
      com.demo.MainPresenter is injected at
          com.demo.MainActivity.presenter
      com.demo.MainActivity is injected at
          com.demo.di.AppComponent.inject(com.demo.MainActivity)

下面是我的匕首代码

@Component(modules = [
    AndroidInjectionModule::class,
    MainActivityModule::class
])
interface AppComponent {
    fun inject(application: MyApplication)

    fun inject(mainActivity: MainActivity)
}

@Module
abstract class MainActivityModule {

    @ContributesAndroidInjector(modules = [MainModule::class)
    abstract fun providesMainActivity(): MainActivity
}

@Module
class MainModule {

    @Provides
    fun providesMainPresenter(): MainPresenter {
        return MainPresenter()
    }
}

我在 MyApplication 中初始化 AppComponent 并且 MainPresenter 被注入到 MainActivity

class MyApplication : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.create()
                .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingAndroidInjector
    }

}

class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var presenter: MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnLaunch.setOnClickListener { presenter.onLaunchClicked() }
    }
}

我在网上浏览了多个示例,但没有一个证明有帮助。有其他人遇到过这个问题吗?

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    您必须从您的AppComponent 中删除fun inject(mainActivity: MainActivity)

    虽然您正确地将 MainModule 和演示者添加到 Activity 子组件(@ContributesAndroidInjector 的东西),但您的 AppComponent 对此一无所知。如果没有缺少依赖项,则无法从那里注入 MainActivity,因此会出现错误。请参阅How do I fix Dagger 2 error '… cannot be provided […]'? ,了解有关您的错误以及如何阅读的一般信息。

    作为旁注,您应该使用 Dagger 查找构造函数注入以避免编写带有模块的样板。

    【讨论】:

    • 谢谢!这确实帮助我了解了如何阅读匕首错误并在图表中导航。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多