错误匕首缺失在Kotlin中使用匕首2绑定

时间:2020-05-14 20:26:11

标签: android

在Koltin中尝试实现Dagger 2之后,我面临一个小问题,我几乎尝试了在Stack over Flow和其他文章上在其他主题中看到的所有内容,但没有任何解决方法,这就是我的错误面对,如果任何人可以帮忙或指导我解决问题,谢谢

  • 这是生成的错误
error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,? extends javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
public abstract interface MainComponent extends dagger.android.AndroidInjector<com.example.foodapp.di.BaseApplication> {
                ^
      java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,? extends javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
          com.example.foodapp.di.DiComponents.ViewModelProviderFactory(creators)
      com.example.foodapp.di.DiComponents.ViewModelProviderFactory is injected at
          com.example.foodapp.MainActivity.provider
      com.example.foodapp.MainActivity is injected at

  • 这是我的AuthViewModelModule,我在其中映射我的viewmodel类
@Module
abstract class AuthViewModelsModule {
    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    abstract fun bindAuthViewModel(viewModel: MainViewModel): ViewModel?
}
  • 这是我的ViewModelKey
@MustBeDocumented
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)
  • 这是我的ViewModelProvierFactory
lass ViewModelProviderFactory @Inject constructor(private val creators: Map<Class<out ViewModel>, Provider<ViewModel>>) :
    ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        var creator: Provider<out ViewModel>? = creators[modelClass]
        if (creator == null) { // if the viewmodel has not been created

            // loop through the allowable keys (aka allowed classes with the @ViewModelKey)
            for ((key, value) in creators) {

                // if it's allowed, set the Provider<ViewModel>
                if (modelClass.isAssignableFrom(key)) {
                    creator = value
                    break
                }
            }
        }

        // if this is not one of the allowed keys, throw exception
        requireNotNull(creator) { "unknown model class $modelClass" }

        // return the Provider
        return try {
            creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }

    companion object {
        private const val TAG = "ViewModelProviderFactor"
    }

}

  • 这是AppComponent类
@Component(modules = [AndroidSupportInjectionModule::class,AndroidBuildersModule::class, ViewModelFactoryModule::class, AppModule::class])
interface MainComponent : AndroidInjector<BaseApplication>{

    @Component.Builder
    interface toBuild
    {
        @BindsInstance
        fun Building(application: Application) : toBuild
        fun build() : MainComponent
    }
}

1 个答案:

答案 0 :(得分:1)

您似乎忘记了将AuthViewModelsModule.class添加到AppComponent类中的模块中