[英]Dependency injection using hilt on singleton private constructor class
I'm new to hilt.我是新手。 So i want to try dependency injection with hilt on my project which use MVVM architecture.
所以我想在我的使用 MVVM 架构的项目上尝试依赖注入。 The structure look like this: JsonHelper -> RemoteDataSource -> Repository -> ViewModel.
结构如下所示:JsonHelper -> RemoteDataSource -> Repository -> ViewModel。
The problems occur when i try to inject my DI on RemoteDataSource and Repository since these classes are singleton class and have a private constructor.当我尝试在 RemoteDataSource 和 Repository 上注入我的 DI 时会出现问题,因为这些类是 singleton class 并具有私有构造函数。 The error codes look like this
错误代码如下所示
..location\RemoteDataSource.java:40: error: Dagger does not support injection into Kotlin objects
public static final class Companion {
..location\Repository.java:30: error: Dagger does not support injection into Kotlin objects
public static final class Companion {
And these are my RemoteDataSource and Repository codes, i have tried injecting it on the constructor but it says Dagger can't inject on private constructors so then i tried to inject it on the function but still didn't work这些是我的 RemoteDataSource 和 Repository 代码,我尝试将它注入构造函数,但它说 Dagger 不能注入私有构造函数,所以我尝试将它注入 function 但仍然没有工作
RemoteDataSource.kt远程数据源.kt
@Singleton
class RemoteDataSource private constructor(private val jsonHelper: JsonHelper) {
companion object {
@Volatile
private var instance: RemoteDataSource? = null
@Inject
fun getInstance(jsonHelper: JsonHelper): RemoteDataSource =
instance ?: synchronized(this) {
instance ?: RemoteDataSource(jsonHelper).apply { instance = this }
}
}
fun getAllRemoteMovies(moviesCallback: LoadMoviesCallback) {
moviesCallback.onAllMoviesReceived(jsonHelper.loadRemoteMovies())
}
fun getAllRemoteTVShows(tvshowCallback: LoadTVShowCallback) {
tvshowCallback.onAllTVShowsReceived(jsonHelper.loadRemoteTVShows())
}
interface LoadMoviesCallback {
fun onAllMoviesReceived(moviesResponses: ArrayList<MovieItem>)
}
interface LoadTVShowCallback {
fun onAllTVShowsReceived(tvshowResponses: ArrayList<TVShowItem>)
}
}
Repository.kt存储库.kt
@Singleton
class Repository private constructor(private val remoteDataSource: RemoteDataSource) : DataSource {
companion object {
@Volatile
private var instance: Repository? = null
@Inject
fun getInstance(remoteDataSource: RemoteDataSource): Repository =
instance ?: synchronized(this) {
instance ?: Repository(remoteDataSource).apply { instance = this }
}
}
override fun getAllRemoteMovies(): LiveData<ArrayList<MovieItem>> {
val remoteMoviesResult = MutableLiveData<ArrayList<MovieItem>>()
remoteDataSource.getAllRemoteMovies(object : RemoteDataSource.LoadMoviesCallback {
override fun onAllMoviesReceived(moviesResponses: ArrayList<MovieItem>) {
remoteMoviesResult.value = moviesResponses
}
})
return remoteMoviesResult
}
override fun getAllRemoteTVShows(): LiveData<ArrayList<TVShowItem>> {
val remoteTVShowsResult = MutableLiveData<ArrayList<TVShowItem>>()
remoteDataSource.getAllRemoteTVShows(object : RemoteDataSource.LoadTVShowCallback {
override fun onAllTVShowsReceived(tvshowResponses: ArrayList<TVShowItem>) {
remoteTVShowsResult.value = tvshowResponses
}
})
return remoteTVShowsResult
}
}
And this is my injection module RemoteDataSourceModule.kt这是我的注入模块 RemoteDataSourceModule.kt
@Module
@InstallIn(ActivityComponent::class)
object RemoteDataSourceModule {
@Singleton
@Provides
fun provideJsonHelper(context: Context): JsonHelper {
return JsonHelper(context)
}
@Singleton
@Provides
fun provideRemoteDataSource(jsonHelper: JsonHelper): RemoteDataSource {
return RemoteDataSource.getInstance(jsonHelper)
}
@Singleton
@Provides
fun provideRepository(remoteDataSource: RemoteDataSource): Repository {
return Repository.getInstance(remoteDataSource)
}
}
So how can i solve this problem without changing the class constructor to public?那么如何在不将 class 构造函数更改为 public 的情况下解决这个问题呢?
@Singleton annotation is enough to notify that the class is a singleton class, so i just remove the companion object and changes private constructor with a public constructor so the code will look like this: @Singleton annotation is enough to notify that the class is a singleton class, so i just remove the companion object and changes private constructor with a public constructor so the code will look like this:
@Singleton
class RemoteDataSource @Inject constructor(private val jsonHelper: JsonHelper) {
// Your codes
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.