java - 带有继承的 Dagger-Android Activity 注入:“这种类型支持成员注入,但不能隐式提供。”
问题描述
我有三个活动,它们通过继承相关。
这些活动中只有一个使用片段注入。
其中两个活动需要 Dagger 2 活动注入。第三个活动不需要任何注射。
以下是我的活动:
/**
* Needs activity injection.
*/
class ThirdActivity extends SecondActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// calls the super, which will call AndroidInjection.inject(this);
// ... other code not shown
}
}
/**
* This activity requires fragment injection
*/
class SecondActivity extends FirstActivity
{
@Inject
DispatchingAndroidInjector<Fragment> fragmentInjector;
@Override
public AndroidInjector<Fragment> supportFragmentInjector()
{
return fragmentInjector;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
}
/**
* Does not use injection.
*/
class FirstActivity extends Activity
{
// no injection required
}
这是我的 Dagger 2 模块
@Module
abstract class AppModule
{
@ActivityScope
@ContributesAndroidInjector(modules = {ThirdActivityModule.class, SecondActivityModule.class})
abstract ThirdActivity contributeThirdActivityInjector();
@ActivityScope
@ContributesAndroidInjector(modules = {SecondActivityModule.class})
abstract SecondActivity contributeSecondActivityInjector();
}
@Module
abstract class SecondActivityModule
{
@Binds
abstract Activity bindActivity(SecondActivity secondActivity);
@FragmentScope
@ContributesAndroidInjector(modules = {MyFragmentModule.class})
abstract MyFragment contributeMyFragmentInjector();
}
@Module
public abstract class ThirdActivityModule
{
@Binds
abstract Activity bindActivity(ThirdActivity thirdActivity);
}
@Module
abstract class MyFragmentModule
{
@Binds
abstract Fragment bindFragment(MyFragment mFragment);
}
我得到的错误是:
Note: Recompile with -Xlint:unchecked for details.
/dagger/AppComponent.java:45: error: [Dagger/MissingBinding]
[dagger.android.AndroidInjector.inject(T)]
com.example.SecondActivity cannot be provided without an @Inject constructor or an @Provides-annotated method.
This type supports members injection but cannot be implicitly provided.
我认为这可能是因为我在通话中都包含了SecondActivityModule
和,但我不确定。ThirdActivityModule
contributesThirdActivityInjector()
在继承的情况下,任何有关活动/片段注入的帮助/建议将不胜感激。
解决方案
在ThirdActivityModule
中,尝试将返回类型更改bindActivity
为SecondActivity
:
@Module
public abstract class ThirdActivityModule {
/**
* Upcasts ThirdActivity to SecondActivity. SecondActivityModule will do
* the rest to upcast it to Activity.
*/
@Binds
abstract SecondActivity bindActivity(ThirdActivity thirdActivity);
}
我怀疑 Dagger 想要在Activity
某处满足依赖请求,并且根据 Dagger 的@Binds
规则,SecondActivityModule.bindActivity
必须以某种方式获得SecondActivity
.
然后这个修改ThirdActivityModule.bindActivity
让 Dagger 知道它可以ThirdActivity
当作一个SecondActivity
.
推荐阅读
- java - 查询解析器构建 Predicate 以过滤内存中的 bean
- qt - 如何在qml中添加一个带有另一个组件的新组件作为参数
- vb.net - VB.Net - 如何在对象列表中调用对象的方法?
- java - 为用户电报机器人发送照片时出现问题
- python-3.x - Luminoth 需要 TensorFlow >= 1.5 安装
- ios - 快速将 UILabel 添加到 UITextView
- java - 使用 JDBI 3 执行任意 SQL(文件)
- r - 插入符号包中多个列的 createDataPartition
- python - 将字典值映射到另一个字典的最佳方法是什么
- sql-server - SQL 查询 - 按几列过滤有效和无效数据