每当我尝试将子组件与绑定对象一起使用时,就会遇到一个依赖周期。我有一个应用程序范围和一个活动范围。在应用程序范围内,我创建了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
每个对象都有一个@Inject构造函数
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
但是错误消息到此为止。在使用子组件将对象放在图形上然后将它们注入到对象中时,我是否缺少某些东西?用匕首不可能吗?
答案 0 :(得分:2)
git pull origin master --> pulling new code
yarn generate --> for generating project as static to /dist folder
sudo chmod -R caddy:caddy /dist --> adding caddy user permission to dist folder
systemctl reload caddy --> reload caddy service
用于使Dagger知道接口的不同实现。您不需要@Binds
,因为Navigator和Controller是不实现任何接口的普通类。我认为MockWebService也是如此。另外,这些类具有@Binds
,这意味着dagger可以实例化它们,而我们无需为这些类编写额外的@Inject constructor
函数。
@Provides
未进行任何范围界定。唯一的工作就是告诉匕首有关不同的实现。您可以将@Binds
与@XScope
添加在一起以使某些对象成为作用域。或者,您可以仅将范围注释添加到类声明中。 Here's一个如何将范围添加到类声明的示例。
关于依赖性周期,我认为这是因为您要告诉@Binds
使用ActivityComponent
并告诉ActivityModule
安装ActivityModule
。 (我认为)应该只做一个。