<android.arch.lifecycle.ViewModel >> не может быть предоставлен без аннотируемого метода @ Provides - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь создать модуль viewmodel, как в этом примере , но у меня появляется эта ошибка

ошибка: java.util.Map, javax.inject.Provider> не может быть предоставлен без аннотируемого метода @ Provides.

Я последовал всему примеру, вот мои коды

Класс ViewModelFactory

@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {

    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> mCreators;

    @Inject
    ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        mCreators = creators;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        Provider<? extends ViewModel> creator = mCreators.get(modelClass);
        if (creator == null) {
            for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : mCreators
                    .entrySet()) {
                if (modelClass.isAssignableFrom(entry.getKey())) {
                    creator = entry.getValue();
                    break;
                }
            }
        }
        if (creator == null) {
            throw new IllegalArgumentException("unknown model class " + modelClass);
        }
        try {
            return (T) creator.get();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Класс ViewModelModule

@Module
public abstract class ViewModelModule {

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);

}

и это компонент

@Singleton
@Component(modules = {AppModule.class, ViewModelModule.class})
public interface MainComponent {


    void inject(Sdk sdk);

    void injectTestActivity(TestActivity testActivity);


}

PS: эта реализация в библиотеке Android не в проекте приложения

1 Ответ

0 голосов
/ 24 января 2019

Вам необходимо связать свои модели представлений, используя Dagger multibindings .Другими словами, связывайте ваши модели представлений и аннотируйте их с помощью @IntoMap аннотации с несколькими связываниями.В том же примере, который вы разместили, вы можете найти пример этого здесь .В этом примере они создали аннотацию ViewModelKey, чтобы указать ключ, из которого Dagger может извлечь вашу модель вида из карты (обычно это класс модели представления).Dagger создаст карту во время компиляции, и поэтому вы получаете сообщение об ошибке - если вы не укажете какую-либо модель вида, которая будет частью карты, Dagger не сможет знать, какие типы он должен создавать.

...