MVVM-使用自定义工厂的Dagger 2

时间:2018-08-16 11:45:39

标签: android mvvm dagger-2

我遵循了this指南,并达到了必须为ViewModel类使用自定义构造函数的地步(这引发了运行时崩溃...UserViewModel> has no zero argument constructor

所以,我尝试了什么:   首先,我进行了搜索,发现我需要一个自己实现的Factory。.

@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;

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

@NonNull
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
    Provider<? extends ViewModel> creator = creators.get(modelClass);
    if (creator == null) {
        for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.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);
    }
}

@Module
abstract class ViewModelFactoryModule {
    @Binds
    @IntoMap
    @ViewModelKey(UserViewModel.class)
    abstract ViewModel bindUserViewModel(UserViewModel userViewModel);

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory viewModelFactory);
}
}

做到了,但是我无法通过

获得我的ViewModel实例
ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class)

ViewModel类的构造方法

@Inject
public UserViewModel(UserRepository userRepository){
    this.userRepository = userRepository;
}

我还能做什么?我知道有一些有关此的主题,但我查了一下却没有成功。.我真的错过了什么吗?

2 个答案:

答案 0 :(得分:0)

该异常表明反射未能找到零参数构造函数,我想您已经创建了具有多参数构造函数且未定义零参数构造一的UserViewModel。请检查一下。

答案 1 :(得分:0)

创建viewModel默认构造函数,并在活动或片段中进行初始化

public UserViewModel(){

}

并在活动中初始化

UserViewModel userViewModel=new UserViewModel(); userViewModel=ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);

修复此问题后,我遇到了同样的问题。您可以使用它。它将为您提供帮助。