android - 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 请求
解决方案
推荐阅读
- php - 按下按钮时在网页中重新排序 SQL 结果
- swift - SwiftUI - 尝试制作可编码的枚举但出现错误:“无法推断通用参数'S'”
- reactjs - ReactJS - 为不同的 URL(路由路径)提供不同的内容,因此它看起来像一个多页面应用程序
- c# - 将对象分配给对象类型的属性
- r - 无法找到班级主体
- xml - XML XPath 将 YYYMMDD 日期转换为月份名称?
- python-3.x - 比较两个不同 pandas 列中的值
- java - Apache POI:完全从 Word 模板文件中删除图表
- python - 脚本适用于其他人,不适用于我(错误:self.fp = io.open(file, filemode) PermissionError: [Errno 13] Permission denied)
- java - 如何将 Java 日期对象转换为带有时区的 Matlab 日期时间数组