我创建了自定义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);
我什么都不给构造函数任何东西。那我该如何传递一些东西给构造函数呢?
答案 0 :(得分:0)
我发现可疑的一件事是
{country name}
@Binds abstract ViewModelFactory bindViewModelFactory(ViewModelFactory factory);
的思想是将实现绑定到接口,您将@Binds
绑定到自身,这将导致匕首编译错误。
尝试删除此行,看看是否有帮助。