Dagger2,ViewModelProvider.Factory:<some-type>使用多个@MapKey注释类型

时间:2019-06-04 10:40:15

标签: android dagger-2 dagger

我正在开发定义一些片段的库。现在,该库需要集成到已经存在的应用程序中。

两个项目都使用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
}

有什么想法吗?感觉就像我遗漏了一些非常明显的东西

0 个答案:

没有答案