2

親コンポーネントのマップに貢献できるかどうか、またはどのように貢献できるかを知りたいです。

これは、親コンポーネントとそのグラフの私の設定です:

@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を持たせたい:ComponentAppComponent

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.FactoryAppComponentこれに正しく注入されますが、 はそれ自体のプロバイダーをバインドしないStartActivityため、明らかに空です。私がやりたいことは、後でそれぞれにバインドされた s のプロバイダーが、ファクトリが使用するものと同じになることです。この問題を正しい角度から見ていないか、この目的のために Dagger 2 に欠けている機能があるかのどちらかです。AppModuleViewModelViewModelActivityMap

Activityオプションで、 myのコンポーネントをサブコンポーネントとして 宣言することもできましたが、モジュール性が失われます。

4

0 に答える 0