匕首-安卓 带继承的活动注入:"This type supports members injection but cannot be implicitly provided."



我有三个活动,它们通过继承相关。

这些活动中只有一个使用片段注入。

其中两个活动需要注射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.

我想这可能是因为我在contributesThirdActivityInjector()电话中包含了SecondActivityModuleThirdActivityModule,但我不确定。

在继承的情况下,任何关于活性/片段注入的帮助/建议将不胜感激。

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来满足某处的依赖请求,并且根据SecondActivityModule.bindActivity@Binds规则,dagger必须以某种方式获得SecondActivity.

然后这个修改后的ThirdActivityModule.bindActivity让dagger知道它可以将ThirdActivity视为SecondActivity

最新更新