首页 > 解决方案 > 带有继承的 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和,但我不确定。ThirdActivityModulecontributesThirdActivityInjector()

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

标签: javaandroiddagger-2dagger

解决方案


ThirdActivityModule中,尝试将返回类型更改bindActivitySecondActivity

@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.


推荐阅读