gpt4 book ai didi

java - 我无法提供 ViewModel

转载 作者:行者123 更新时间:2023-12-02 00:22:56 25 4
gpt4 key购买 nike

当我在 @ContributesAndroidInjector(modules = [MainFragmentBuilderModule::class, LoginViewModelProviderModule::class]) 中包含 LoginViewModelProviderModule 时,我无法使用 LoginViewModelProviderModule 提供 LoginViewModel 但当我将其包含在中时它可以工作ActivityBuilderModule 类中的 @Module 注解。

基础应用程序组件

@Suppress("unused")
@Singleton
@Component(
modules = [AndroidInjectionModule::class,
ActivityBuilderModule::class,
ViewModelFactoryModule::class]
)
interface BaseApplicationComponent : AndroidInjector<BaseApplicationClass> {

@Component.Builder
interface Builder {

@BindsInstance
fun application(application: Application): Builder

fun build(): BaseApplicationComponent
}
}

ActivityBuilderModule

@Module
abstract class ActivityBuilderModule {

@LoginScope
@ContributesAndroidInjector(modules = [MainFragmentBuilderModule::class, LoginViewModelProviderModule::class])
abstract fun contributeMainActivity(): MainActivity
}

MainFragmentBuilderModule

@Module
abstract class MainFragmentBuilderModule {

@ContributesAndroidInjector
abstract fun contributesLoginFragment(): LoginFragment
}

LoginViewModelProviderModule

@Suppress("unused")
@Module
abstract class LoginViewModelProviderModule {
@Binds
@IntoMap
@ViewModelKey(LoginViewModel::class)
abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel
}

ViewModelFactoryModule

@Module
abstract class ViewModelFactoryModule {

@Binds
abstract fun bindViewModelFactory(viewModelProviderFactory: ViewModelProviderFactory): ViewModelProvider.Factory
}

ViewModelProviderFactory

@Singleton
class ViewModelProviderFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass") as Throwable
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}

登录范围

@Scope
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class LoginScope

ViewModelKey

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

这是我看到的错误:

错误:如果没有@Provides注释的方法,则无法提供[Dagger/MissingBinding] java.util.Map,javax.inject.Provider>。公共(public)抽象接口(interface) BaseApplicationComponent 扩展 dagger.android.AndroidInjector { ^ java.util.Map,javax.inject.Provider> 被注入(inject) com.example.mydemoapplication.viewmodel_factory.ViewModelProviderFactory(创建者) com.example.mydemoapplication.viewmodel_factory.ViewModelProviderFactory 被注入(inject) com.example.mydemoapplication.LoginFragment.viewModelProviderFactory com.example.mydemoapplication.LoginFragment 被注入(inject) dagger.android.AndroidInjector.inject(T) [com.example.mydemoapplication.dagger.BaseApplicationComponent ? com.example.mydemoapplication.dagger.ActivityBuilderModule_ContributeMainActivity.MainActivitySubcomponent ? com.example.mydemoapplication.dagger.MainFragmentBuilderModule_ContributesLoginFragment.LoginFragmentSubcomponent]

最佳答案

您只能创建一个模块来绑定(bind)应用程序中的所有 View 模型。您可以在我的示例应用程序中查看详细信息: sample-moviedb-app

基础应用程序组件:

@Suppress("unused")
@Singleton
@Component(
modules = [AndroidInjectionModule::class,
ActivityBuilderModule::class,
ViewModelFactoryModule::class,
ViewModelModule::class]

)
interface BaseApplicationComponent : AndroidInjector<BaseApplicationClass> {
@Component.Builder
interface Builder {

@BindsInstance
fun application(application: Application): Builder

fun build(): BaseApplicationComponent
}
}

ViewModelModule:

@Suppress("unused")
@Module
abstract class ViewModelProviderModule {
@Binds
@IntoMap
@ViewModelKey(LoginViewModel::class)
abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel

//other viewmodels in application
@Binds
abstract fun bindViewModelFactory(viewModelProviderFactory:ViewModelProviderFactory): ViewModelProvider.Factory
}

主模块:

@Module
class MainModule {
@MainActivityScope
@Provides
fun provideViewModel(mainActivity: MainActivity, viewModelFactory: ViewModelProviderFactory) =
ViewModelProviders.of(mainActivity, viewModelFactory).get(LoginViewModel::class.java)
}

登录 View 模型:

class LoginViewModel @Inject constructor(
) : ViewModel() {

}

关于java - 我无法提供 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58071371/

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