問題描述:首先在單一工程多個(gè)module的情況下,運(yùn)行良好,拆分完組件后,在A module中通過全路徑名訪問B module一個(gè)viewmodel(通用的列表處理vm),這時(shí)報(bào)錯(cuò)了。
首先說怎么解決:
修改前對(duì)B module的引用? implementationrootProject.ext.dependencies["bf_circle"]
修改后:api rootProject.ext.dependencies["bf_circle"]
就這樣好了榨馁。
解決路徑:
首先打印一個(gè)在A module 中可以正常使用的viewmodel 的初始化堆棧如下圖:
出錯(cuò)的viewmodel 初始化堆棧如下圖:
發(fā)現(xiàn)出錯(cuò)的vm 初始化一直調(diào)用到最上層的create,?
最后調(diào)用了 class 的newinstance ()换棚,為什么會(huì)這樣?因?yàn)檎也坏?對(duì)應(yīng)的key 保存的vm,工廠類找不到合適的構(gòu)造方法(構(gòu)造參數(shù)沒有比對(duì)合適)初始化vm,最終給了上層最原始的方式去獲取陶耍,調(diào)用無參構(gòu)造,但是vm初始化使用?@ViewModelInject 的構(gòu)造需要傳入 room 等參數(shù)她混,這些參數(shù)也是hilt注入的呀烈钞,這tm.....? ? ?最后發(fā)現(xiàn)下圖泊碑,
這是正常初始化vm 的時(shí)候,工廠里存在的對(duì)象毯欣,這一看都是A module自己的和底層提供通用的馒过,這為何呢?
機(jī)智如你酗钞,底層通用的vm 都能初始化腹忽,為何B module里面的不能呢? 看前面的答案就明白了砚作。
結(jié)論:api 是暴露給上層使用窘奏,? ? ? implementation 只是本層能夠使用
猜想:hilt 的作用域的處理和上面的結(jié)論有關(guān)? 先這樣吧葫录,只能說自己項(xiàng)目組件化還在路上着裹,把通用的東西放在common才是正道,好了压昼,這個(gè)疑問先放著求冷,有時(shí)間再來抓你。