親コンポーネントのマップに貢献できるかどうか、またはどのように貢献できるかを知りたいです。
これは、親コンポーネントとそのグラフの私の設定です:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
ViewModelProvider.Factory plusViewModelFactory();
}
@Module
public abstract class AppModule {
@Multibinds
abstract Map<Class<? extends ViewModel>, ViewModel> bindViewModels();
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(MyViewModelFactory myViewModelFactory);
}
@Singleton
public class MyViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
MyViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
// ... Irrelevant code
}
}
次に、それぞれにに依存するActivity
を持たせたい:Component
AppComponent
public class StartActivity extends Activity {
@Module
static abstract class StartModule {
@Binds
@IntoMap
@ViewModelKey(StartViewModel.class)
abstract ViewModel bindStartViewModel(StartViewModel startViewModel);
}
@StartScope
@Component(dependencies = AppComponent.class, modules = StartModule.class)
interface StartComponent {
void inject(StartActivity startActivity);
}
@Inject
ViewModelProvider.Factory viewModelFactory;
@Override
protected void onCreate(Bundle savedInstanceState) {
StartComponent component = DaggerStartActivity_StartComponent
.builder()
.appComponent(((MyApplication) getApplication()).getAppComponent())
.build();
component.inject(this);
super.onCreate(savedInstanceState);
System.out.println(viewModelFactory.toString());
// ... Irrelevant code
}
}
の境界ViewModelProvider.Factory
はAppComponent
これに正しく注入されますが、 はそれ自体のプロバイダーをバインドしないStartActivity
ため、明らかに空です。私がやりたいことは、後でそれぞれにバインドされた s のプロバイダーが、ファクトリが使用するものと同じになることです。この問題を正しい角度から見ていないか、この目的のために Dagger 2 に欠けている機能があるかのどちらかです。AppModule
ViewModel
ViewModel
Activity
Map
Activity
オプションで、 myのコンポーネントをサブコンポーネントとして 宣言することもできましたが、モジュール性が失われます。