Внедрение Dagger-Android Activity с наследованием: «Этот тип поддерживает внедрение членов, но не может быть предоставлен неявно». - PullRequest
0 голосов
/ 12 апреля 2019

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

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

Два действия требуют инъекции активности 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 Ответ

1 голос
/ 15 апреля 2019

В 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);
}

Я подозреваю, что Кинжал хочет, чтобы Activity где-то выполнял запросы зависимости, и@Binds Правило SecondActivityModule.bindActivity Кинжал должен каким-то образом получить SecondActivity.

Затем этот модифицированный ThirdActivityModule.bindActivity позволяет Даггеру знать, что он может трактовать ThirdActivity как SecondActivity.

...