没有 @Provides-annotated 方法就不能提供 Hilt

Posted

技术标签:

【中文标题】没有 @Provides-annotated 方法就不能提供 Hilt【英文标题】:Hilt cannot be provided without an @Provides-annotated method 【发布时间】:2021-12-05 18:01:05 【问题描述】:

我有一个活动视图模型

@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: UserRepository
)     : ViewModel() 


存储库接口

interface UserRepository 
suspend fun loginUser(username: String, password: String): Pair<Boolean, String>

用户数据源类如下​​

internal class UserDataSource @Inject constructor(private val octaveApi: OctaveApi) :
UserRepository 

override suspend fun loginUser(username: String, password: String): Pair<Boolean, String> 
    return Pair(false, "unsucess")


这是我的匕首实现

@Module
@InstallIn(SingletonComponent::class)
abstract class ApiModule 

  @Module
  @InstallIn(SingletonComponent::class)
  object Providers 

    @Provides
    @Singleton
    internal fun provideOctaveApi(retrofit: Retrofit): OctaveApi =
      retrofit.create(OctaveApi::class.java)
  


@Module
@InstallIn(ActivityRetainedComponent::class)
abstract class RetainedDataModule 

  @Binds
  internal abstract fun bindUserRepository(userDataSource: UserDataSource):     UserRepository

当我构建项目时出现此错误

/OctaveDashboard/app/build/generated/source/kapt/stagingExternalDebug/com/octave/OctaveApplication_HiltComponents.java:125: error: [Dagger/MissingBinding] com.octave.data.user.UserRepository cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements OctaveApplication_GeneratedInjector,
                     ^
  com.octave.data.user.UserRepository is injected at
      com.octave.MainViewModel(cornersRepository)
  com.octave.MainViewModel is injected at
      com.octave.MainViewModel_HiltModules.BindsModule.binds(vm)
  @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
      dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.octave.OctaveApplication_HiltComponents.SingletonC → com.octave.OctaveApplication_HiltComponents.ActivityRetainedC → com.octave.OctaveApplication_HiltComponents.ViewModelC]

似乎无法找出导致问题的原因。

【问题讨论】:

我假设UserDataSource 已将@Inject 添加到其构造函数中? @MarkKeen 是的,它注入了 octaveApi 对象。我已经添加了课程 所有这些类都在同一个模块中?我注意到您出于某种原因有内部可见性修饰符。 @MarkKeen 有多个模块。 UserDataSource 和 api 模块在 1 个模块中。 Userrepository 在第二个模块中,mainviewmodel 在 app 模块中 可能只需要在你的构造函数中使用 internal。 【参考方案1】:

我的应用程序模块中缺少模块依赖项,这是造成此问题的原因。能够通过包含它来修复。

【讨论】:

【参考方案2】:

将@Provides 添加到您的函数中

 internal class UserDataSource @Inject constructor(private val octaveApi: OctaveApi) :
UserRepository 

@Provides
override suspend fun loginUser(username: String, password: String): Pair<Boolean, String> 
    return Pair(false, "unsucess")


【讨论】:

以上是关于没有 @Provides-annotated 方法就不能提供 Hilt的主要内容,如果未能解决你的问题,请参考以下文章

kotlin + Dagger2 :没有@Provides-annotated 方法就无法提供

Dagger2:如果没有 @Provides-annotated 方法,就无法提供 ViewModel

错误:[Dagger/MissingBinding] Map<Class<?扩展 ViewModel>, Provider<ViewModel>> 不能在没有 @P

java中数组有没有length()方法?string没有lenght()方法?

在java中,有main方法的类叫啥类,没有main方法的类叫啥类

axios没有install方法