【问题标题】:Android Dagger-Hilt ignores @Provides methodAndroid Dagger-Hilt 忽略 @Provides 方法
【发布时间】:2021-09-13 23:04:52
【问题描述】:

我有一个NetworkModule 和一个RepositoryModule。在我的NetworkModule 中,我有创建改造服务实例的方法(也有创建okHttpClientgson 的方法,但这些不相关):

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    @Singleton
    @Provides
    fun provideRetrofit(okHttpClient: OkHttpClient, gson: Gson): Retrofit {
        return Retrofit.Builder()
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl("null")
            .client(okHttpClient)
            .build()
    }

    @Singleton
    @Provides
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

然后我想在我的RepositoryModule 中使用ApiService,但 Hilt 只是忽略了 NetworkModule 中的 Provides 方法甚至存在。我查看了生成的代码,找不到提到provideApiService。 Android Studio 也将其标记为未使用。我确定这东西应该可以工作,Android Studio 甚至在相关文件中显示它:

这里是NetworkModule

@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {

    @Singleton
    @Provides
    fun provideLoginRepository(
        userMessage: MutableLiveData<Message>,
        apiService: ApiService
    ): LoginRepository {
        return LoginRepositoryImpl(userMessage, apiService)
    }
}

当我尝试构建它时,我得到了这个错误:

error: [Dagger/MissingBinding] LoginRepository cannot be provided without an @Provides-annotated method.

起初似乎存储库无法注入,但我已将其指向 ApiService,因为如果我从 provideLoginRepository 方法参数中删除它,它会成功构建。

我已经尝试了几个小时来解决这个问题,并且尝试了几乎所有方法。如果有人知道这是怎么回事,我会非常感激。提前致谢。

编辑:在 provideLoginRepository 函数内创建 ApiService 的实例可以使一切正常并且应用程序成功构建,这不是所需的修复:

@Singleton
@Provides
fun provideLoginRepository(
    userMessage: MutableLiveData<Message>,
    retrofit: Retrofit
): LoginRepository {
    return LoginRepositoryImpl(userMessage, retrofit.create(ApiService::class.java))
}

【问题讨论】:

  • userMessage: MutableLiveData&lt;Message&gt; 是如何提供的?这可能是罪魁祸首,因此无法提供 LoginRepository 的副作用。
  • @MarkKeen 我也想过这个问题,但是当我在没有 ApiService 的情况下成功构建它时,它就被淘汰了。只是为了完成,它是这样提供的:@Singleton @Provides fun provideUserMessenger(): MutableLiveData&lt;Message&gt; { return MutableLiveData&lt;Message&gt;() }(丑陋的评论格式,对不起)
  • 当你从 provideLoginRepository() 中删除参数并返回一个空对象时会发生什么,即 provideLoginRepository() : LoginRepository = object : LoginRepository { .... overridden methods } - 所以你不依赖于提供者链。
  • 。当然我假设你在每次重试之前已经清理了构建缓存..
  • @MarkKeen 好吧,这几乎就是我所做的,但只删除了apiService。之后,它就成功构建了。需要明确的是,在 provideLoginRepository() 中创建服务实例可以工作并且还可以构建(请参阅我的编辑)

标签: android kotlin dependency-injection retrofit2 dagger-hilt


【解决方案1】:

好吧,我已经解决了这个问题。事实证明,java 不(与 kotlin 不同)在包名称中支持 interface。猜猜看,ApiService 在一个名为interface 的包中。重命名包后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2022-11-28
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多