android - 带有 ViewModel 的 Android Hilt 范围为 Navgraph,Provider Factory 问题
问题描述
我正在使用Hilt进行依赖注入,专门用于注入ViewModel。还想将ViewModel 范围限定为 NavGraph。为此,通过传递NavGraph 获取ViewModelStoreOwner,现在通过将 navgraph 提供的存储实例传递给 ViewModelProvider 来创建ViewModel。我面临的问题是,因为我只传递了store 实例来获取ViewModelProvider而没有任何Factory,因为Hilt会实现它,所以我遇到了构建错误没有零参数构造函数。当看到源代码时,我发现由于我只提供store 实例作为参数而没有工厂,因此自动提供了一个简单的工厂,并且提供的工厂没有参数,因此出现此错误。
如何解决这个问题?
从源代码(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
}
任何帮助,将不胜感激
谢谢
解决方案
如果您的 ViewModel 的范围仅限于导航图,请使用
defaultViewModelProviderFactory
可用于带有 注释的活动和片段的对象@AndroidEntryPoint
。
所以你可以使用:
_viewModel = new ViewModelProvider(viewModelStoreOwner,
getDefaultViewModelProviderFactory()).get(QuakeListViewModel.class);
推荐阅读
- postgresql - pgpool 第二个备用状态显示“关闭”
- java - 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序
- ios - 如何在 SwiftUI 中使用 Image 使 MKMapView 可拖动
- r - R中的pgmm函数和gmm函数
- sql - PostgreSQL 事务中输入末尾的语法错误
- r - 将 2 个变量分组,然后分隔字符串
- html - 从网页进行 UDP 广播搜索
- python - 如何通过模型视图集上的列表/检索功能进行过滤
- javascript - 如何将负二进制数转换为int?
- android - 在没有客户端的情况下在 system_server 上运行 Frida hooks