gpt4 book ai didi

带有 ViewModel 的 Android Hilt 范围为 Navgraph,Provider Factory 问题

转载 作者:行者123 更新时间:2023-12-04 23:56:17 27 4
gpt4 key购买 nike

我正在使用 刀柄 对于 依赖注入(inject) 专门用于注入(inject)查看型号 .
还想范围 ViewModel 到 NavGraph .为此,请获取 ViewModelStoreOwner 通过 导航图 现在创建 查看型号 通过 导航图提供的存储实例 ViewModelProvider .我面临的问题是,因为我只通过 存储实例 获取 ViewModelProvider 没有任何工厂 , 自 刀柄 将实现它,我得到构建错误 没有零参数构造函数 .当看到源代码时,我发现我只提供了 存储实例 作为论据,没有工厂,正在自动提供一个简单的工厂提供的工厂没有参数 ,因此出现此错误。
如何解决这个问题?
从源调用的方法 (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 类需要依赖注入(inject) -
    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;
}
我的 fragment 课 -
    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 :

If your ViewModel is scoped to the navigation graph, use the defaultViewModelProviderFactory object that is available to activities and fragments that are annotated with @AndroidEntryPoint.


所以你可以使用:
_viewModel = new ViewModelProvider(viewModelStoreOwner,
getDefaultViewModelProviderFactory()).get(QuakeListViewModel.class);

关于带有 ViewModel 的 Android Hilt 范围为 Navgraph,Provider Factory 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com