使用 Hilt 注入 Retrofit

5

我是Hilt的新手,之前也没有正确使用过Dagger。我遇到了以下错误:

[Dagger/MissingBinding] retrofit2.Retrofit cannot be provided without an @Inject constructor or an 
@Provides-annotated method.

我已经在提供Retrofit方法上标注了@provides,并将其安装在Application组件中。我想要在我的主Activity中注入它,并在那里使用了inject注解。我尝试将其安装在Activity组件中,但结果仍然相同。

这是我的Retrofit模块。

@Module
@InstallIn(ApplicationComponent::class)
class RetrofitModule {

@Singleton
@Provides
fun provideGson(): Gson {
    return GsonBuilder().create()
}

@Singleton
@Provides
fun provideRetrofit (gson: Gson): Retrofit{
   return Retrofit.Builder().baseUrl("Base Url")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build()
}
}

在我的主Activity中,我已经编写了以下代码进行注入。
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

@Inject lateinit var retrofit: Retrofit

@iamanbansal 如我所提到的,我将其注入主活动中。我已添加了注入代码行。 - Aditya Kurkure
应用程序类怎么样?您使用过注释@HiltAndroidApp吗? - Thracian
@Thracian 是的,我也将它添加到了我的清单中。 - Aditya Kurkure
@ADM 尝试过了,仍然不起作用。 - Aditya Kurkure
@iamanbansal 可能是依赖关系的问题吗? - Aditya Kurkure
显示剩余13条评论
2个回答

2
尝试按照以下方式更改您的代码:

尝试按照以下方式更改您的代码:

@Module
@InstallIn(ApplicationComponent::class)
Object RetrofitModule {

    @Singleton
    @Provides
    fun provideRetrofit (gson: Gson): Retrofit{
       return Retrofit.Builder().baseUrl("Base Url")
            .addConverterFactory(
                   GsonConverterFactory.create(GsonBuilder().create())
             )
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build()
    }
}

不要创建类,而是创建对象。不要在单独的函数中创建Gson。当我使用Moshi转换器时,我也遇到了这个错误。


0

我认为你的Retrofit返回类型是错误的。尝试这个(对我有效):

@Singleton
@Provides
fun provideRetrofit (gson: Gson): Retrofit.Builder() {
   return Retrofit.Builder()
        .baseUrl("Base Url")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
}

编辑:将class RetrofitModule更改为object RetrofitModule!否则,@Provides永远不会执行。请记住,在onCreate()之后才能使用您的retrofit。


谢谢,但如果返回类型错误,我认为代码不会被执行(我还尝试了一下,它没有起作用)。并且对象也不能工作。 - Aditya Kurkure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接