Android “如何修复”;[Dagger/MissingBinding]:如果没有@Provides注释方法,则无法提供;
我正在将dagger与Android “如何修复”;[Dagger/MissingBinding]:如果没有@Provides注释方法,则无法提供;,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,我正在将dagger与视图模型集成。当我将viewmodelprovider工厂包含在AppComponent中时,应用程序未获得构建,其显示错误,如 错误:[Dagger/MissingBinding]java.util.Map,javax.inject.Provider>如果没有@Provides注释方法,则无法提供。我在下面添加了我的代码 ViewModelFactory class DaggerViewModelFactory @Inject constructor(private va
视图模型集成。当我将viewmodelprovider
工厂包含在AppComponent
中时,应用程序未获得构建,其显示错误,如
错误:[Dagger/MissingBinding]java.util.Map,javax.inject.Provider>如果没有@Provides注释方法,则无法提供。我在下面添加了我的代码
ViewModelFactory
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)
}
}
}
我的片段生成器类
@Module
abstract class FragmentBuilder {
@ContributesAndroidInjector
abstract fun injectWelcomeFragment() : WelcomeFragment
}
然后我的片段类将包含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
}
}
和视图模型来集成片段
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
}
}
您可以检查[如何修复Dagger 2错误'…无法提供[…]'?]()以了解一些一般信息。如果您需要进一步帮助,请更新您的问题,以包含完整的错误消息(如链接问题中所示)。快速一看,我看不到您在任何地方添加了WelcomeModule
。我已经包含了我的欢迎模块。但是您没有在任何地方使用它(@组件(模块=[在此处或类似位置找不到它])
)您的错误是否已解决?是@Mohammedrawala
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
}