gpt4 book ai didi

android - ViewModel 中的 Kotlin Dagger 字段注入(inject)引发 Dagger/Binding 异常

转载 作者:行者123 更新时间:2023-12-02 12:41:29 27 4
gpt4 key购买 nike

我关注了this tutorial为了在我的 View 模型中进行 DI。但我目前被卡住了。

我为我的 View 模型创建了一个 ViewModelFactory,如下所示:

class HomeViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>,
Provider<ViewModel>>
): ViewModelProvider.Factory{

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return creators[modelClass]?.get() as T
}
}

后跟一个 ViewModel:
class HomeViewModel @Inject constructor(private val songsRepository: SongsRepository): ViewModel()

对于 DI,我创建了两个组件。一个是我的主应用程序组件,另一个是依赖于主应用程序的组件。
@Singleton
@Component(modules = [AppModule::class])
public interface AppComponent {
fun songRepository(): SongsRepository
fun libraryManager(): LibraryManager
fun inject(mainActivity: MainActivity)
}


@Module
public class AppModule(val application: Application){

@Provides @Singleton
fun providesApplication(): Application{
return application
}

@Provides @Singleton
fun providesLibraryManager(): LibraryManager {
return LibraryManager(application)
}

@Provides @Singleton
fun providesSongRepository(libraryManager: LibraryManager): SongsRepository {
return SongsRepository(libraryManager)
}
}

而我的 ViewModelModule 如下:
@Module
public class ViewModelModule {

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)

@AppScope
@Provides
fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, Provider<ViewModel>>): HomeViewModelFactory {
return HomeViewModelFactory(providerMap)
}

@AppScope
@IntoMap
@Provides
@ViewModelKey(HomeViewModel::class)
fun providesHomeViewModel(songsRepository: SongsRepository): HomeViewModel{
return HomeViewModel(songsRepository)
}
}

@AppScope
@Component(modules = [ViewModelModule::class], dependencies = [AppComponent::class])
public interface ViewModelComponent {
fun homeViewModelFactory(): HomeViewModelFactory
fun homeViewModel(): HomeViewModel
fun inject(homeFragment: HomeFragment)
}

我得到的错误是:

error: [Dagger/MissingBinding] java.util.Map,? extends javax.inject.Provider> cannot be provided without an @Provides-annotated method.



我真的不知道为什么会发生这种情况,因为我所有的类都有 @Inject 构造函数。 Dagger 的文档也没有帮助我。如果您能就此问题给我建议,我将不胜感激。

最佳答案

错误信息表明以下代码错误:

fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, Provider<ViewModel>>): HomeViewModelFactory {
return HomeViewModelFactory(providerMap)
}

它应该是
fun providesHomeViewModelFactory(providerMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>): HomeViewModelFactory {
return HomeViewModelFactory(providerMap)
}

这是因为 Map的签名接口(interface)是 Map<K, out V> ,这意味着 Map<..., Provider<ViewModel>>将编译为 Map<..., ? extends Provider<ViewModel>> Java 代码,因此您向 dagger 询问后一个,但它的对象图中只有前一个,然后编译器会向您抛出错误。

关于android - ViewModel 中的 Kotlin Dagger 字段注入(inject)引发 Dagger/Binding 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com