对singleton私有构造函数类使用hilt进行依赖注入



我是希尔特的新手。因此,我想在我的项目中尝试完全依赖注入,该项目使用MVVM架构。结构如下:JsonHelper->RemoteDataSource->存储库->ViewModel。

当我试图在RemoteDataSource和Repository上注入DI时,就会出现问题,因为这些类是单例类,并且有一个私有构造函数。错误代码看起来像这个

..locationRemoteDataSource.java:40: error: Dagger does not support injection into Kotlin objects
public static final class Companion {
..locationRepository.java:30: error: Dagger does not support injection into Kotlin objects
public static final class Companion {

这些是我的RemoteDataSource和Repository代码,我试着在构造函数上注入它,但它说Dagger不能在私有构造函数上注入,所以我试着把它注入函数,但仍然不能工作

远程数据源.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>)
}
}

存储库.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
}
}

这是我的注射模块远程数据源模块.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)
}
}

那么,如何在不将类构造函数更改为public的情况下解决这个问题呢?

@Singleton注释足以通知该类是一个Singleton类,所以我只删除伴随对象,并用公共构造函数更改私有构造函数,这样代码就会如下所示:

@Singleton
class RemoteDataSource @Inject constructor(private val jsonHelper: JsonHelper) {
// Your codes
}

最新更新