如何解决带有ViewModel的Android Hilt限于Navgraph,提供者工厂问题
我正在使用 Hilt 进行依赖项注入,专门用于注入 ViewModel 。 还希望将ViewModel扩展到NavGraph 。为此,通过传递 NavGraph 来获取 ViewModelStoreOwner ,现在通过传递navgraph提供的 store实例来创建 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
}
任何帮助将不胜感激
谢谢
解决方法
根据Integration with the Jetpack navigation library documentation:
如果您的ViewModel是scoped to the navigation graph,请使用
defaultViewModelProviderFactory
对象,该对象可用于以@AndroidEntryPoint
注释的活动和片段。
因此您可以使用:
_viewModel = new ViewModelProvider(viewModelStoreOwner,getDefaultViewModelProviderFactory()).get(QuakeListViewModel.class);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。