gpt4 book ai didi

android - 如何修复 "[Dagger/MissingBinding] : Cannot be provided without an @Provides-annotated method"

转载 作者:行者123 更新时间:2023-11-29 02:20:08 32 4
gpt4 key购买 nike

我正在将 dagger 与 viewmodel 集成。当我在 AppComponent 中包含 viewmodelprovider 工厂时,应用程序没有得到构建并且它显示了类似

的错误

"error: [Dagger/MissingBinding] java.util.Map,javax.inject.Provider> cannot be provided without an @Provides-annotated method". I have added my code below.

View 模型工厂

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

override fun <T : ViewModel> create(modelClass: Class<T>): T {
var creator: Provider<out ViewModel>? = creators[modelClass]
if (creator == null) {
for ((key, value) in creators) {
if (modelClass.isAssignableFrom(key)) {
creator = value
break
}
}
}
if (creator == null) {
throw IllegalArgumentException("unknown model class " + modelClass)
}
try {
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}

}
}

然后我有我的AppComponent

@Singleton
@Component(modules = [AndroidInjectionModule::class, ViewModelFactoryModule::class, ActivityBuilder::class])
interface AppComponent : AndroidInjector<FreedomApplication> {

@Component.Builder
interface Builder {
@BindsInstance
fun application(application: DaggerApplication): Builder

fun build(): AppComponent

}
}

我的viewmodel模块绑定(bind)类

@Module
abstract class WelcomeModule {
@Binds
@IntoMap
@ViewModelKey(WelcomeViewModel::class)
abstract fun bindWelcomeViewModel(welcomeViewModel: WelcomeViewModel): ViewModel
}

我的 fragment 生成器类

@Module
abstract class FragmentBuilder {

@ContributesAndroidInjector
abstract fun injectWelcomeFragment() : WelcomeFragment

}

然后我的 fragment 类包含viewmodelprovider工厂

class WelcomeFragment @Inject constructor(): DaggerFragment() {
@Inject
lateinit var providerFactory: ViewModelProvider.Factory

companion object {
fun newInstance() = WelcomeFragment()
}

private lateinit var viewModel: WelcomeViewModel

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.welcome_fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this, providerFactory).get(WelcomeViewModel::class.java)
// TODO: Use the ViewModel
}
}

并为 fragment 集成 View 模型

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

// TODO: Implement the ViewModel
}

最佳答案

修复了上述问题,请引用下面的代码。

@Singleton
@Component(modules = [ActivityBuilder::class, NetworkModule::class, ViewBindModule::class, AndroidSupportInjectionModule::class])
interface AppComponent : AndroidInjector<FreedomApplication> {

override fun inject(application: FreedomApplication)

@Component.Builder
interface Builder {
@BindsInstance
fun application(application: FreedomApplication): Builder

fun build(): AppComponent
}

}
@Module
abstract class ActivityBuilder {

@ContributesAndroidInjector(modules = [FragmentBuilder::class])
abstract fun bindWelcomeActivity (): WelcomeActivity

@ContributesAndroidInjector(modules = [FragmentBuilder::class])
abstract fun bindDashBoardActivity (): DashBoardActivity
}
@Module
abstract class ViewBindModule {
@Binds
abstract fun bindViewModelFactory(factory: DaggerViewModelFactory): ViewModelProvider.Factory

@Binds
@IntoMap
@ViewModelKey(WelcomeViewModel::class)
abstract fun bindWelcomeViewModel(viewModel: WelcomeViewModel): ViewModel

@Binds
@IntoMap
@ViewModelKey(LoginViewModel::class)
abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel

@Binds
@IntoMap
@ViewModelKey(DashBoardViewModel::class)
abstract fun bindDashboardViewModel(viewModel: DashBoardViewModel): ViewModel
}
class DaggerViewModelFactory @Inject constructor(private val creators: Map<Class <out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>):ViewModelProvider.Factory {

@Suppress("UNCHECKED_CAST")

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
var creator :Provider<ViewModel>? = creators[modelClass]

if (creator == null)
for ((key, value) in creators){
if (modelClass.isAssignableFrom(key)){
creator = value
break
}
}

if (creator == null) throw IllegalArgumentException("Unknown model class")
try{
return creator.get() as T
}catch (e:Exception){
throw RuntimeException(e)
}
}
}
abstract class FragmentBuilder {

@ContributesAndroidInjector
abstract fun bindWelcomeFragment(): WelcomeFragment

@ContributesAndroidInjector
abstract fun bindLoginFragment(): LoginFragment

@ContributesAndroidInjector
abstract fun bindDashBoardFragment(): DashBoardFragment
}

关于android - 如何修复 "[Dagger/MissingBinding] : Cannot be provided without an @Provides-annotated method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701708/

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