С помощью dagger-android
теперь можно просто написать следующее и успешно внедрить зависимости приложения:
@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
}
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
AndroidInjectionModule.class,
AppModule.class,
MainActivityModule.class
})
public interface ApplicationComponent {
void inject(BaseApplication baseApplication);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
ApplicationComponent build();
}
}
@Module
public abstract class AppModule {}
public class MainActivity extends AppCompatActivity implements
HasSupportFragmentInjector {
@Inject
DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector;
@Inject
Whatever whatever;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public AndroidInjector<Fragment> supportFragmentInjector() {
return dispatchingAndroidInjector;
}
}
public class BaseApplication extends Application implements
HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
@Override
public void onCreate() {
DaggerApplicationComponent.builder()
.application(this)
.build()
.inject(this);
super.onCreate();
}
}
public class Whatever {
private final FragmentManager fragmentManager;
@Inject
Whatever(MainActivity mainActivity) {
this.fragmentManager = mainActivity.getSupportFragmentManager();
}
}
Очень тривиальный пример. В основном подключите все, чтобы иметь возможность получить объект Whatever
с правильным внедренным менеджером фрагментов. Это нормально и работает.
Однако что, если я хочу использовать основную активность внутри модуля? Скажем, я хочу сделать так, чтобы Whatever
явно выставляла зависимость диспетчеру фрагментов, изменив аргумент конструктора:
@Inject
Whatever(FragmentManager fragmentManager) {...}
Теперь мне нужно предоставить эту зависимость. Как это сделать? Итак, я пробовал следующее:
@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
@Provides
static FragmentManager providesFragmentManager(MainActivity activity) {
return activity.getSupportFragmentManager();
}
}
Теперь кинжал жалуется, что не может найти @Providers
для MainActivity
. Я думал, что метод @ContributesAndroidInjector
сможет обеспечить активность. Я также немного озадачен тем, как у него не было проблем с внедрением зависимости в первом случае, но теперь он не может этого сделать.
Я также пытался построить для этого фабрику, например:
public FragmentManagerFactory {
private final FragmentManager fm;
@Inject
FragmentManagerFactory(MainActivity mainActivity){
this.fm = mainActivity.getSupportFragmentManager();
}
public FragmentManager get() {
return fm;
}
}
@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector
abstract MainActivity contributesMainActivity();
@Provides
static FragmentManager providesFragmentManager(FragmentManagerFactory fragmentManagerFactory) {
return fragmentManagerFactory.get();
}
}
Что заканчивается той же ошибкой.
Кому-нибудь удалось это сделать?? Раньше это было довольно просто, можно было просто построить модуль с экземпляром MainActivity
, сохранить его в поле и предоставить его. Теперь... все происходит за кулисами.
Был бы очень признателен за помощь!
@Subcomponent
дляMainActivity
- person Blackbelt   schedule 27.07.2017AndroidInjector
- person Fred   schedule 27.07.2017