我正在开发定义一些片段的库。现在,该库需要集成到已经存在的应用程序中。
两个项目都使用Dagger2和Dagger2 Android,我可以修改库和应用程序的源代码。他们都使用MVVM并使用this方式将ViewModel实例插入其片段。
在图书馆,我有
绑定模块:
@Module
abstract class LibViewModelBindingModule {
@Binds
internal abstract fun bindLibViewModelFactory(factory: LibraryViewModelFactory): ViewModelProvider.Factory
}
LibraryViewModelFactory
class LibraryViewModelFactory
@Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}
该应用基本上具有上述类别的复本:
应用绑定模块:
@Module
abstract class AppViewModelBindingModule {
@Binds
internal abstract fun bindAppViewModelFactory(factory: AppViewModelFactory): ViewModelProvider.Factory
}
AppViewModelFactory
class AppViewModelFactory
@Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}
将库集成到应用程序中后(作为.aar
,并将库中定义的Dagger2模块添加到应用程序的Dagger2依赖关系图后,尝试进行构建时,由于以下原因,Dagger停止了构建错误:
e: <long-path>/MainAppComponent.java:37: error: [Dagger/MapKeys] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> uses more than one @MapKey annotation type
public interface MainAppComponent {
^
我知道从理论上讲我可以删除AppViewModelFactory
并也可以在应用程序中使用LibraryViewModelFactory
,但这是更多的工作并且感觉很可行。我也不想对将要集成到我的库中的所有应用程序执行此操作。
除其他外,我还尝试对LibraryViewModelFactory
收到的地图使用限定符,但这无济于事:
class LibraryViewModelFactory
@Inject constructor(@LibraryViewModelsMap private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}
有什么想法吗?感觉就像我遗漏了一些非常明显的东西