【问题标题】:Dagger2 ViewModel cannot be provided problem with @Binds ViewModelProvider factory@Binds ViewModelProvider 工厂无法提供 Dagger2 ViewModel 问题
【发布时间】:2019-04-24 13:01:46
【问题描述】:

我已经实现了对 ViewModel 注入的支持,以符合 medium articlegoogleRepo

不幸的是,我收到了错误 cannot be provided without an @Provides-annotated method.,但我无法深入了解它。

我已将项目迁移到 AndroidX。我在 StackOverflow 上尝试了许多可用的答案,但均未成功。

应用组件

@Singleton
@Component(
        modules = [
            AndroidInjectionModule::class,
            AppModule::class,
            MainActivityModule::class,
            LoginActivityModule::class,
            DispatcherActivityModule::class]
)
interface AppComponent {

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

        fun build(): AppComponent
    }

    fun inject(androidApplication: BeeApp)
}

应用模块

@Module(includes = [ViewModelModule::class])
class AppModule {
...(i provide non-related other object here)
}

ViewModelModule

@Suppress("unused")
@Module
abstract class ViewModelModule {
    @Binds
    @IntoMap
    @ViewModelKey(UserProfileViewModel::class)
    abstract fun bindUserViewModel(userProfileViewModel: UserProfileViewModel): ViewModel

    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}

DaggerViewModelFactory

@Singleton
@Suppress("UNCHECKED_CAST")
class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
        ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = viewModelsMap[modelClass] ?: viewModelsMap.asIterable().firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        return try {
            creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }

}

片段

class UserProfileFragment : BaseFragment(), Injectable {

    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    lateinit var profileViewModel: UserProfileViewModel

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        profileViewModel = ViewModelProviders.of(this, viewModelFactory)
                .get(UserProfileViewModel::class.java)
    }

(...)
}

视图模型


class UserProfileViewModel @Inject constructor(userAccountRepository: UserAccountRepository) : ViewModel() {
    val userAccount: LiveData<Resource<UserAccount>> = userAccountRepository.loadUserAccount(true)

}

任何帮助将不胜感激。

【问题讨论】:

    标签: viewmodel dagger-2 dagger


    【解决方案1】:

    这是由 Kotlin kapt 版本 1.3.30 issue tracker 上的问题引起的

    更改为以前/更新的版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2017-08-02
      相关资源
      最近更新 更多