Android Hilt с ViewModel с привязкой к Navgraph, проблема с Provider Factory

Я использую Hilt для внедрения зависимостей специально для внедрения в ViewModel. Также хотел масштабировать ViewModel до NavGraph. Для этого получил ViewModelStoreOwner, передав NavGraph, а теперь создал ViewModel, передав экземпляр магазина, предоставленный навигационным графом на 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
    }

Мы будем благодарны за любую помощь

Спасибо


person Debarshi Bhattacharjee    schedule 12.10.2020    source источник


Ответы (1)


Согласно Интеграция с документацией по библиотеке навигации Jetpack :

Если ваша модель просмотра привязана к навигационному графу, используйте defaultViewModelProviderFactory объект, доступный для действий и фрагментов, помеченных @AndroidEntryPoint.

Итак, вы можете использовать:

_viewModel = new ViewModelProvider(viewModelStoreOwner,
    getDefaultViewModelProviderFactory()).get(QuakeListViewModel.class);
person ianhanniballake    schedule 12.10.2020
comment
Будет ли он изменен на hiltNavGraphViewModels, если мы используем рукоять для DI? - person nabeel; 24.05.2021
comment
@nabeel - да, этот API - удобная оболочка, которая выполняет этот вызов за вас. - person ianhanniballake; 24.05.2021