gpt4 book ai didi

android - 错误: [Dagger/DuplicateBindings] com. example.StartRouter被绑定(bind)多次?

转载 作者:行者123 更新时间:2023-12-04 23:56:39 55 4
gpt4 key购买 nike

我有课StartRouter .我想为每个 Activity 提供此类的不同实例,并且只要 Activity 还活着(为此我制作了 @ActivityScope )就让它保持 Activity 状态。

问题是它在我的代码中没有这样做。似乎 Dagger 为每个注释提供一个实例,在我的情况下,一次用于 @ActivityScope .此范围是自定义 Dagger 范围。

这是我的两个模块(每个 Activity 一个),第一个模块:

@Module
public class SplashModule {

@Provides
SplashVMFactory splashVMFactory(StartRouter startRouter){
return new SplashVMFactory(startRouter);


@Provides
StartRouter startRouter(){
return new StartRouter();
}

}

第二个模块:
@Module
public class QuestionModule {

@Provides
QuestionVMFactory questionVMFactory(StartRouter startRouter){
return new QuestionVMFactory(startRouter);
}

@Provides
StartRouter startRouter(){
return new StartRouter();
}

}

我有这个:
@Module
public abstract class BinderModule {

@ActivityScope
@ContributesAndroidInjector(modules = SplashModule.class)
abstract SplashActivity bindSplashActivity();

@ActivityScope
@ContributesAndroidInjector(modules = QuestionModule.class)
abstract QuestionActivity bindQuestionActivity();

}

我的应用程序组件:
@ApplicationScope
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class,
QuestionModule.class})
public interface AppComponent {

@Component.Builder
interface Builder {
@BindsInstance
Builder application(App app);
AppComponent build();
}

void inject(App app);

}

当我运行这个我得到这个错误:
error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times:
@Provides com.example.StartRouter com.example.QuestionModule.startRouter()
@Provides com.example.StartRouter com.example.SplashModule.startRouter()
com.example.StartRouter is injected at
com.example.LoginModule.loginVMFactory(…, startRouter)
com.example.LoginVMFactory is injected at
com.example.LoginActivity.factory
com.example.LoginActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindLoginActivity.LoginActivitySubcomponent]
It is also requested at:
com.example.QuestionModule.questionVMFactory(…, startRouter)
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindQuestionActivity.QuestionActivitySubcomponent]

(从我的错误中可以看出,除了两个示例之外,其他模块中还提供了 StartRouter)。

我想,如果我理解正确的话,从 @ActivityScope 的用法在 BinderModule@ContributesAndroidInjector只要 Activity 本身,就会为每个 Activity 创建不同的组件,但我似乎理解错了?

如果我区分不同的 StartRouter在我的 @module使用 @named并提供 1 个模块,无需 @named那么这将通过提供不同的 StartRouter 来解决问题实例?但这对我的问题没有帮助。我的问题是,简而言之,我无法提供 @ActivityScoped StartRouter与 Activity 本身一样长的实例(每个 Activity 1 个)。关于我如何做到这一点的任何建议?

最佳答案

您的设置很好,但是您还将两个模块(都绑定(bind) StartRouter )添加到 AppComponent ,因此您多次绑定(bind)它的错误。

@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }

由于您希望每个 Activity 有一个实例,因此无需将模块添加到 AppComponent .您应该能够从中删除这两个模块。

关于android - 错误: [Dagger/DuplicateBindings] com. example.StartRouter被绑定(bind)多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56761359/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com