Кинжал 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 иметь 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 но очевидно пустой, как AppModule просто не связывает никаких поставщиков каких-либо ViewModel сам. Но я бы хотел, чтобы провайдеры ViewModelсвязаны позже каждым Activity помещены в то же самое Map что фабрика использует. Либо я не смотрю на эту проблему под прямым углом, либо в Dagger 2 отсутствует функция для этой цели.

По желанию я мог пойти с объявлением моего ActivityКомпонент как подкомпонент, но тогда я теряю модульность.

0 ответов

Другие вопросы по тегам