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