每当我尝试使用带有绑定对象的子组件时,我就会得到一个依赖循环。我有一个应用程序范围和一个活动范围。在app范围内,我创建我的web服务,然后当活动打开时,我要创建一个存储对象、控制器和导航器(所有自定义类,而不是androidx类),并将它们注入到我的androidx ViewModel类中。但当我这样做时,我会得到一个依赖循环。
我的顶级组件看起来像
@AppScope
@Component(modules = [AppModule::class])
interface AppComponent {
val activityComponentBuilder: ActivityComponent.Builder
}
@Module(subcomponents = [ActivityComponent::class])
interface AppModule {
@Binds
fun mockWebService(mockWebService: MockWebService): MockWebService
}
接下来,我的子组件看起来像
@ActivityComponent
@Subcomponent(modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(sharedViewModel: SharedViewModel)
@Subcomponent.Builder
interface Builder {
@BindsInstance
fun storage(storage: Storage): Builder
fun build(): ActivityComponent
}
}
@Binds
abstract fun controller(controller: Controller): Controller
@Binds
abstract fun navigator(navigator: Navigator): Navigator
class Navigator @Inject constructor(private val storage: Storage)
class Controller @Inject constructor(
private val webService: MockWebService,
private val navigator: Navigator,
private val storage: Storage
) {
@Inject
lateinit var navigator: Navigator
@Inject
lateinit var controller: Controller
init {
MainApplication.component.activityComponentBuilder
.storage(InMemoryStorage.from(UUID.randomUUID().toString()))
.build()
.inject(this)
}
[Dagger/DependencyCycle] Found a dependency cycle: public abstract interface AppComponent {
MockWebService is injected at di.AppModule.mockWebService(mockWebService)
MockWebService is injected at ActivityModule.Controller(webService, …)
Controller is injected at SharedViewModel.controller
SharedViewModel is injected at
但错误消息在那里截断了。我是不是在如何使用子组件将对象放到图上,然后将它们注入到一个对象中时遗漏了什么?这用匕首不行吗?
@binds
用于让dagger了解接口的不同实现。这里不需要@binds
,因为Navigator和Controller是不实现任何接口的普通类。我认为MockWebService也是这种情况。而且,这些类有@inject constructor
,这意味着dagger可以实例化它们,我们不需要为这些类编写额外的@provide
函数。
@binds
没有执行任何作用域。它唯一的工作就是告诉dagger不同的实现方式。可以将@xscope
与@binds
一起添加,使某些对象具有作用域。或者,您可以将作用域注释添加到类声明中。下面是一个如何向类声明添加作用域的示例。
至于依赖循环,我认为这是因为您告诉activitycomponent
使用activitymodule
并告诉activitymodule
安装activitycomponent
。只做其中一个应该是这样的(我认为)。
我得到以下生成错误: 错误:[dagger.android.androidinjector.inject(T)]没有@provides-annotated方法,无法提供android.support.v4.app.fragmentManager。 公共抽象接口AppComponent扩展dagger.android.androidinjector{^android.support.v4.app.f
在阅读dagger 2的文档时,我找不到一种简单的方法来在构建测试应用时提供依赖项。我找到的唯一线索是: 匕首2不支持覆盖。覆盖简单测试假货的模块可以创建模块的子类来模拟该行为。应该分解使用覆盖并依赖依赖依赖项注入的模块,以便将被覆盖的模块表示为两个模块之间的选择。 我不明白我将如何在Android上设置这样的配置,任何人都可以解释吗?
问题内容: 我在Android应用程序中将Dagger2用于DI。我发现我必须为使用@Inject字段的每个类编写注入方法。有没有一种方法可以只注入父类,而不必在每个子类上调用inject?以活动为例。我有一个“ 每个活动都从中延伸”的内容。有没有一种方法,我可以在BaseActivity的组件中创建一个注入方法,然后在BaseActivity的onCreate中调用inject,子活动中的@in
问题内容: 这是我目前拥有的并且可以正常工作: 现在,我想添加另一个依赖项。我将其更改为: 但是现在我收到此错误消息: FragmentFacebookLoginComponent依赖于多个作用域组件 我该如何解决?我如何有多个依赖关系? 如果我从一个组件中删除范围,则会收到此错误消息: AnotherComponent(无作用域)不能依赖范围内的组件 问题答案: 最后,我创建了一个具有正确范围的
使用 @Inject 注解可以向 Controller 以及 Interceptor 中注入依赖对象,使用注入功能需要如下配置: public void configConstant(Constants me) { // 开启对 jfinal web 项目组件 Controller、Interceptor、Validator 的注入 me.setInjectDependency(t
例如,Foos的资源可能如下所示: 对于酒吧: