记一次组件化hilt viewmodelfactory 的坑

问题描述:首先在单一工程多个module的情况下,运行良好,拆分完组件后,在A module中通过全路径名访问B module一个viewmodel(通用的列表处理vm),这时报错了。

首先说怎么解决:

修改前对B module的引用  implementationrootProject.ext.dependencies["bf_circle"]

修改后:api rootProject.ext.dependencies["bf_circle"]

就这样好了。

解决路径:

首先打印一个在A module 中可以正常使用的viewmodel 的初始化堆栈如下图:

出错的viewmodel 初始化堆栈如下图:


发现出错的vm 初始化一直调用到最上层的create, 




最后调用了 class 的newinstance (),为什么会这样?因为找不到 对应的key 保存的vm,工厂类找不到合适的构造方法(构造参数没有比对合适)初始化vm,最终给了上层最原始的方式去获取,调用无参构造,但是vm初始化使用 @ViewModelInject 的构造需要传入 room 等参数,这些参数也是hilt注入的呀,这tm.....     最后发现下图,


这是正常初始化vm 的时候,工厂里存在的对象,这一看都是A module自己的和底层提供通用的,这为何呢?

机智如你,底层通用的vm 都能初始化,为何B module里面的不能呢? 看前面的答案就明白了。

结论:api 是暴露给上层使用,      implementation 只是本层能够使用

猜想:hilt 的作用域的处理和上面的结论有关? 先这样吧,只能说自己项目组件化还在路上,把通用的东西放在common才是正道,好了,这个疑问先放着,有时间再来抓你。

你可能感兴趣的:(记一次组件化hilt viewmodelfactory 的坑)