Внедрение активности Dagger-Android с наследованием: «Этот тип поддерживает внедрение элементов, но не может быть предоставлен неявно».

#java #android #dagger-2 #dagger

#java #Android #dagger-2 #dagger

Вопрос:

У меня есть три действия, которые связаны по наследству.

Только одно из этих действий использует внедрение фрагмента.

Для двух действий требуется внедрение активности 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() вызов, но я не уверен.

Любая помощь / советы по внедрению активности / фрагмента в случае наследования будут оценены.

Комментарии:

1. У меня есть внедрение фрагмента со случаем наследования в моем проекте . Пожалуйста, посмотрите на FragmentModule и ActivityBindingModule

Ответ №1:

В 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 , чтобы an где-то выполнял запросы зависимостей, и по @Binds правилу SecondActivityModule.bindActivity Dagger должен каким-то образом получить SecondActivity .

Затем это изменение ThirdActivityModule.bindActivity позволяет Dagger знать, что он может обрабатывать ThirdActivity как SecondActivity .