贡献AndroidInjector不注入模块
ContributesAndroidInjector does not inject module
我一直在尝试 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() }
}
}
我在网上查看了多个示例,但其中 none 被证明是有帮助的。还有其他人遇到过这个问题吗?
您必须从 AppComponent
中删除 fun inject(mainActivity: MainActivity)
。
虽然您正确地将 MainModule
和演示者添加到 Activity 子组件(@ContributesAndroidInjector
内容),但您的 AppComponent 对此一无所知。如果没有缺少依赖项,您将无法从那里注入 MainActivity,因此会出现错误。请参阅 如何修复 Dagger 2 错误“...无法提供 [...]”?
有关您的错误的一些一般信息以及您如何阅读它。
作为旁注,您应该查找构造函数注入with Dagger 以避免使用模块编写样板文件。
我一直在尝试 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() }
}
}
我在网上查看了多个示例,但其中 none 被证明是有帮助的。还有其他人遇到过这个问题吗?
您必须从 AppComponent
中删除 fun inject(mainActivity: MainActivity)
。
虽然您正确地将 MainModule
和演示者添加到 Activity 子组件(@ContributesAndroidInjector
内容),但您的 AppComponent 对此一无所知。如果没有缺少依赖项,您将无法从那里注入 MainActivity,因此会出现错误。请参阅 如何修复 Dagger 2 错误“...无法提供 [...]”?
有关您的错误的一些一般信息以及您如何阅读它。
作为旁注,您应该查找构造函数注入with Dagger 以避免使用模块编写样板文件。