带有ViewModel的Android Hilt限于Navgraph,提供者工厂问题

德·巴塔查吉

我正在使用Hilt进行依赖项注入,专门用于注入ViewModel还希望将ViewModel的范围限定为NavGraph要做到这一点,得到了ViewModelStoreOwner通过将NavGraph现在创建视图模型通过传递由navgraph提供存储实例ViewModelProvider我面临的问题是,由于仅传递商店实例以获取不带任何FactoryViewModelProvider,因为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
    }

任何帮助,将不胜感激

谢谢

伊恩汉尼巴拉克

根据与Jetpack导航库文档集成

如果ViewModel的作用域是导航图,请使用defaultViewModelProviderFactory可用于注释的活动和片段对象@AndroidEntryPoint

因此,您可以使用:

_viewModel = new ViewModelProvider(viewModelStoreOwner,
    getDefaultViewModelProviderFactory()).get(QuakeListViewModel.class);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章