[英]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.