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