【发布时间】:2017-10-07 09:42:07
【问题描述】:
我正在使用新的 Dagger2(2.11 版),并且正在使用 AndroidInjector 和 ContributesAndroidInjector 等新功能。我有一个活动子组件,
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector(modules =
{UserListModule.class, MainFragmentModule.class})
@ActivityScope
abstract MainActivity bindsMainActivity();
}
@Module
public abstract class MainFragmentModule {
@ContributesAndroidInjector
@FragmentScope
@FragmentKey(UserListFragment.class)
abstract UserListFragment bindsUserListFragment();
}
而UserListModule 为片段提供了依赖项。一些依赖我只想绑定实例,然后返回,比如
@Binds
@ActivityScope
abstract UserListView mUserListView(UserListFragment userListFragment);
而不是简单地返回依赖,比如
@Provides
@ActivityScope
UserListView mUserListView(UserListFragment userListFragment){
return userListFragment;
}
我的模块也包含一些@Provides 方法。我们可以在同一个模块中同时使用@Binds 和@Provides 方法吗?我试过如下图
@Module
public abstract class UserListModule {
@Provides
@ActivityScope
UserListFragment mUserListFragment() {
return new UserListFragment();
}
@Binds
@ActivityScope
abstract UserListView mUserListView(UserListFragment userListFragment);
// other provides and binds methods...
......
.....
}
它的抛出错误
Error:(22, 8) error: dagger.internal.codegen.ComponentProcessor was unable to process this interface because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
有什么办法吗?
【问题讨论】:
-
您确实意识到您添加到片段管理器的片段将被系统重新创建,并且在进程死亡后可能不会在模块中,对吧?
-
你的意思是我不应该限定片段?能不能说的清楚点?我没有正确理解你
-
进程死亡后,片段将由系统初始化,而不是由该模块初始化。所以你最终可能会得到它的 2 个实例。
-
好的,但实际问题呢? 我们可以在同一个模块中同时使用 Binds 和 Provides 方法吗?
-
我认为
@Binds+@Provides应该可以工作,但我不知道ContributesAndroidInjector是如何影响它的。