我无法使用匕首2将存储库注入ViewModel

时间:2018-07-09 08:24:25

标签: android mvvm dagger-2

我创建了自定义ViewModelProvider.Factory

@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {

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

    @Inject
    public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModels) {
        this.viewModels = viewModels;
    }

    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        Provider<ViewModel> viewModelProvider = viewModels.get(modelClass);

        if (viewModelProvider == null) {
            throw new IllegalArgumentException("model class " + modelClass + " not found");
        }

        return (T) viewModelProvider.get();
    }
}

然后我创建ViewModuleModel类:

@Module
public abstract class ViewModelsModule {

    @Binds
    abstract ViewModelFactory bindViewModelFactory(ViewModelFactory factory);


    @Binds
    @IntoMap
    @ViewModelKey(UsersViewModel.class)
    abstract ViewModel usersViewModel(UsersViewModel UsersViewModel);
}

我创建注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@MapKey
@interface ViewModelKey {
    Class<? extends ViewModel> value();
}

我将ViewModelModel添加到Cpmponent:

@Singleton
@Component(modules = {..., ViewModelsModule.class})
public interface AppComponent {

我创建ViewModel:

public class UsersViewModel extends ViewModel {

    private final UsersRepository usersRepository;
    private final Router router;

    @Inject
    public UsersViewModel(UsersRepository usersRepository, Router router) {
        this.usersRepository = usersRepository;
        this.router = router;
    }

   ....
}

然后我尝试将viewmodel注入片段:

public class UsersFragment extends BaseFragment {

    private UsersViewModel usersViewModel;

    @Inject
    ViewModelFactory viewModelFactory;
...
usersViewModel = ViewModelProviders.of(this, viewModelFactory).get(UsersViewModel.class);

我收到错误消息:

Caused by: java.lang.InstantiationException: java.lang.Class<viewmodels.UsersViewModel> has no zero argument constructor

当我与主持人一起工作时,我就是这样做的:

@Singleton
    @Provides
    UsersPresenter provideUsersPresenter(UsersRepository usersRepository, Router router) {
        return new UserPresenter(usersRepository, router);
    }

并将参数传递给构造函数。但是使用ViewModel时,我不知道它是如何工作的?

自然,这将不起作用:

@Binds
    @IntoMap
    @ViewModelKey(UsersViewModel.class)
    abstract ViewModel usersViewModel(UsersViewModel UsersViewModel);

我什么都不给构造函数任何东西。那我该如何传递一些东西给构造函数呢?

1 个答案:

答案 0 :(得分:0)

我发现可疑的一件事是

{country name}
@Binds abstract ViewModelFactory bindViewModelFactory(ViewModelFactory factory);

思想是将实现绑定到接口,您将@Binds绑定到自身,这将导致匕首编译错误。

尝试删除此行,看看是否有帮助。