简体   繁体   English

安卓:MVP + 刀柄 + 改造

[英]Android: MVP + Hilt + Retrofit

I'm trying add Hilt in Android with MVP and Retrofit, but I don't know how inject Api Service from Retrofit into Presenter.我正在尝试使用 MVP 和 Retrofit 在 Android 中添加 Hilt,但我不知道如何将 Api 服务从 Retrofit 注入到 Presenter。 The Android Studio show me this error: Android Studio 向我展示了这个错误:

error: [Dagger/DependencyCycle] Found a dependency cycle: public abstract static class SingletonC implements App_GeneratedInjector错误:[Dagger/DependencyCycle] 发现一个依赖循环:公共抽象静态类 SingletonC 实现了 App_GeneratedInjector

My code is this:我的代码是这样的:

HomeActivity家庭活动

@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()
    }
}

HomeModule家庭模块

@Module
@InstallIn(ActivityComponent::class)
abstract class HomeModule {
    @Binds
    abstract fun bindActivity(homeActivity: HomeActivity): HomeContract.View

    @Binds
    abstract fun bindPresenter(homePresenter: HomePresenter): HomeContract.Presenter
}

@Module
@InstallIn(ActivityComponent::class)
object HomeActivityModule {
    @Provides
    fun povideActivity(activity: Activity): HomeActivity = activity as HomeActivity
}

RetrofitModule改造模块

@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()) //10MB Cahe

    @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)
}

HomePresenter主播

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

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

HomeApi HomeApi

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

I want to use HomeApi in HomePresenter to call REST API requests我想在 HomePresenter 中使用 HomeApi 来调用 REST API 请求

Hilt comes with support for the most common Android classes. Hilt 支持最常见的 Android 类。 However, you might need to perform field injection in classes that Hilt doesn't support.In those cases, you can create an entry point using the @EntryPoint annotation , you can read more about it here , see this example for usage di module , ui但是,您可能需要在 Hilt 不支持的类中执行字段注入。在这些情况下,您可以使用@EntryPoint注释创建一个入口点,您可以在此处阅读有关它的更多信息,请参阅此示例以了解di 模块的用法, 用户界面

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM