首页 > 解决方案 > Android:MVP + Hilt + Retrofit2

问题描述

我正在尝试使用 MVP 和 Retrofit 在 Android 中添加 Hilt,但我不知道如何将来自 Retrofit 的 Api 服务注入 Presenter。Android Studio 向我显示此错误:

app.api.HomeApi 在 com.example.app.di.module.HomeModule.providePresenter(�, homeApi) 处注入 com.example.app.ui.home.mvp.HomeContract.Presenter 在 com.example.app 处注入。 ui.home.HomeActivity.presenter com.example.app.ui.home.HomeActivity 在 com.example.app.ui.home.HomeActivity_GeneratedInjector.injectHomeActivity(com.example.app.ui.home.HomeActivity) [com.example.app.ui.home.HomeActivity_GeneratedInjector.injectHomeActivity(com.example.app.ui.home.HomeActivity) example.app.di.App_HiltComponents.SingletonC ?com.example.app.di.App_HiltComponents.ActivityRetainedC ?com.example.app.di.App_HiltComponents.ActivityC] injectHomeActivity(com.example.app.ui.home.HomeActivity) [com.example.app.di.App_HiltComponents.SingletonC ? com.example.app.di.App_HiltComponents.ActivityRetainedC ?com.example.app.di.App_HiltComponents.ActivityC] injectHomeActivity(com.example.app.ui.home.HomeActivity) [com.example.app.di.App_HiltComponents.SingletonC ? com.example.app.di.App_HiltComponents.ActivityRetainedC ?com.example.app.di.App_HiltComponents.ActivityC]

我的代码是这样的:

家活动

@AndroidEntryPoint
class HomeActivity : AppCompatActivity(), HomeContract.View {
    @Inject lateinit var presenter: HomeContract.Presenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        presenter.helloM()
    }

    override fun hello() {
        Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show()
    }
}

主页模块

@Module
@InstallIn(ActivityComponent::class)
class HomeModule {
    @Provides
    fun provideActivity(activity: Activity): HomeActivity = activity as HomeActivity

    @Provides
    fun provideView(view: HomeActivity): HomeContract.View = view

    @Provides
    fun providePresenter(view: HomeContract.View, homeApi: HomeApi): HomeContract.Presenter = HomePresenter(view, homeApi)
}

改造模块

@Module(includes = [AppModule::class])
@InstallIn(SingletonComponent::class)
class RetrofitModule {
    companion object {
        private const val BASE_URL = "https://url.com/"
    }

    @Provides
    @Singleton
    fun provideInterceptor() = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

    @Provides
    @Singleton
    fun provideCacheFile(context: Context): File = context.cacheDir

    @Provides
    @Singleton
    fun provideCache(cacheFile: File) = Cache(cacheFile, (10 * 1024 * 1024).toLong())

    @Provides
    @Singleton
    fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor, cache: Cache?): OkHttpClient {
        return OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                .addInterceptor(Interceptor { chain: Interceptor.Chain ->
                    val request = chain.request()
                        .newBuilder()
                        .header("Accept", "application/json")
                        .header("Content-Type", "application/json")
                        .build()

                    chain.proceed(request)
                })
                .cache(cache)
                .build()
    }

    @Provides
    @Singleton
    fun provideGsonConverterFactory(): GsonConverterFactory = GsonConverterFactory.create()

    @Provides
    @Singleton
    fun provideRetrofit(okHttpClient: OkHttpClient, gson: GsonConverterFactory): Retrofit {
        return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(gson)
                .client(okHttpClient)
                .build()
    }

    @Provides
    @Singleton
    fun provideHomeApi(retrofit: Retrofit): HomeApi = retrofit.create(HomeApi::class.java)
}

主页演示者

class HomePresenter @Inject constructor(
    private val view: HomeContract.View?,
    private val homeApi: HomeApi?
    ) : HomeContract.Presenter {

    override fun helloM() {
        view?.hello()
    }
}

主页API

interface HomeApi {
    @GET("users")
    fun getUsers(): Call<Any>?
}

我想在 HomePresenter 中使用 HomeApi 来调用 REST API 请求

标签: androidkotlinretrofitmvpdagger-hilt

解决方案


推荐阅读