Я использую Hilt для внедрения зависимостей специально для внедрения в ViewModel. Также хотел масштабировать ViewModel до NavGraph. Для этого получил ViewModelStoreOwner, передав NavGraph, а теперь создал ViewModel, передав экземпляр магазина, предоставленный навигационным графом strong> на ViewModelProvider. Проблема, с которой я столкнулся, заключается в том, что я передаю только экземпляр магазина, чтобы получить ViewModelProvider без какой-либо Factory, поскольку Hilt будет реализовывать это, я получаю ошибку сборки не имеет конструктора с нулевым аргументом. Увидев исходный код, я обнаружил, что, поскольку я предоставляю только экземпляр хранилища в качестве аргумента, а не фабрику, простая фабрика предоставляется автоматически и как при условии, что у фабрики нет аргументов, отсюда и эта ошибка.
Как решить эту проблему?
Метод, вызываемый из источника (ViewModelProvider.java) -
* Creates {@code ViewModelProvider}. This will create {@code ViewModels}
* and retain them in a store of the given {@code ViewModelStoreOwner}.
* <p>
* This method will use the
* {@link HasDefaultViewModelProviderFactory#getDefaultViewModelProviderFactory() default factory}
* if the owner implements {@link HasDefaultViewModelProviderFactory}. Otherwise, a
* {@link NewInstanceFactory} will be used.
*/
public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
: NewInstanceFactory.getInstance());
}
Мой класс ViewModel, требующий внедрения зависимостей -
private Repository repository;
private MutableLiveData<FeatureCollection> featureCollection = new MutableLiveData<>();
private MutableLiveData<Boolean> loading = new MutableLiveData<>();
private Disposable disposable;
@ViewModelInject
public QuakeListViewModel(Repository repository) {
this.repository = repository;
}
Мой класс фрагмента -
private FragmentQuakeListBinding _binding;
private QuakeListViewModel _viewModel;
private ViewModelStoreOwner viewModelStoreOwner;
private NavController _navController;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_navController = NavHostFragment.findNavController(this);
viewModelStoreOwner = _navController.getViewModelStoreOwner(R.id.main_nav_graph);
}
public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//other implementation
_viewModel = new ViewModelProvider(viewModelStoreOwner).get(QuakeListViewModel.class);
//return binding.root
}
Мы будем благодарны за любую помощь
Спасибо