【问题标题】:MVVM - dagger 2 using custom factoryMVVM - 使用自定义工厂的匕首 2
【发布时间】:2018-08-16 11:45:39
【问题描述】:

我按照this 指南进行操作,做得很好,我不得不为我的 ViewModel 类使用自定义构造函数(这引发了运行时崩溃...UserViewModel> has no zero argument constructor

所以,我尝试了什么: 首先我搜索了一下,发现我需要一个我自己的Factoryimplemented..

@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);
}
}

这样做了,但我无法通过

获取我的 ViewModelinstance
ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class)

ViewModel 类的构造函数

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

我还能做什么?我知道有一些关于它的话题,我查了一下,没有任何成功。我真的错过了什么吗?

【问题讨论】:

标签: android mvvm dagger-2


【解决方案1】:

异常说反射找不到零参数构造函数,我猜你已经创建了带有多参数构造函数的 UserViewModel 并且没有定义零参数一。请检查一下..

【讨论】:

  • 如您所见(如果完整阅读我的问题)是的,我的构造函数不是默认构造函数!这就是我必须实现 Factory 的原因。
  • 你说得对,我没有看到最后几行代码,我正在考虑代码。一切看起来都很棒,除了点被隐藏了。请您提供完整的异常堆栈跟踪信息吗?
  • 最终找到了解决方案。我猜测实际上 Dagger 工作不正常,我是对的。 dagger 没有为我注入构造函数参数的对象 .. 我必须对 dagger 做一些额外的配置(一些小类和注释)
  • @IonutJ.Bejan 你能详细说明你做了什么让它工作吗?我想我面临着和你一样的问题。谢谢。
【解决方案2】:

创建viewModel默认构造函数并像这样在activity或fragment中初始化

public UserViewModel(){

}

并在活动中初始化

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

修复后我遇到了同样的问题..你可以使用它。它会帮助你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2021-10-20
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多