[英]Android Dagger 2 Some Constructors can't Inject into ViewModel
I want to Inject my Room Repositories and Rest Repositories into my ViewModel class. 我想将我的Room Repository和Rest Repository注入到ViewModel类中。 However, I can inject rest repository but, when I try to inject room repository, it gives error. 但是,我可以注入其余存储库,但是当我尝试注入空间存储库时,它会出错。
class RestRepository @Inject constructor(private val restService: RestService) {
fun register(username: String, password: String, email: String): Single<NormalResponse> {
return restService.register(username, password, email)
}
fun createAuthToken(username: String, password: String): Single<TokenResponse> {
return restService.createAuthToken(username, password)
}
}
class MessageRepository @Inject constructor(private val messageDao: MessageDao) {
val all: List<Message> get() = messageDao.getAll
fun insert(vararg messages: Message) {
messageDao.insert(*messages)
}
fun update(message: Message) {
messageDao.update(message)
}
fun delete(message: Message) {
messageDao.delete(message)
}
}
@Module
class RestModule {
@Provides
internal fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
internal fun provideService(retrofit: Retrofit): RestService {
return retrofit.create<RestService>(RestService::class.java)
}
@Provides
internal fun provideRepository(restService: RestService): RestRepository {
return RestRepository(restService)
}
}
@Module(includes = [ApplicationModule::class])
class RoomModule {
@Provides
internal fun provideRoomDatabase(context: Context): AppDatabase {
return AppDatabase.getAppDatabase(context)
}
@Provides
internal fun provideMessageDao(appDatabase: AppDatabase): MessageDao {
return appDatabase.messageDao()
}
@Provides
internal fun provideMessageRepository(messageDao: MessageDao): MessageRepository {
return MessageRepository(messageDao)
}
}
@Module
abstract class MainFragmentBindingModule {
@ContributesAndroidInjector(modules = [ApplicationModule::class, UtilsModule::class, RestModule::class, RoomModule::class])
internal abstract fun provideChatFragmentFactory(): ChatFragment
}
class ChatViewModel @Inject constructor(val restRepository: RestRepository, val messageRepository: MessageRepository) : ViewModel() {
}
And error is like that: 错误是这样的:
error: [dagger.android.AndroidInjector.inject(T)] me.ibrahimsn.capsules.data.local.message.MessageDao cannot be provided without an @Provides-annotated method. 错误:[dagger.android.AndroidInjector.inject(T)]如果没有@Provides注释的方法,则无法提供me.ibrahimsn.capsules.data.local.message.MessageDao。
Edit: Solution https://stackoverflow.com/a/51783147/10203775 编辑:解决方案https://stackoverflow.com/a/51783147/10203775
I fixed the problem, thanks.. 我解决了这个问题,谢谢..
@Module(includes = [(ViewModelModule::class)])
class ApplicationModule {
@Provides
@Singleton
internal fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
internal fun provideRetrofitService(retrofit: Retrofit): RestService {
return retrofit.create<RestService>(RestService::class.java)
}
@Provides
@Singleton
internal fun provideRoomDatabase(app: Application): AppDatabase {
return AppDatabase.getAppDatabase(app)
}
@Provides
@Singleton
internal fun provideMessageDao(appDatabase: AppDatabase): MessageDao {
return appDatabase.messageDao()
}
}
@Singleton
class MessageRepository @Inject constructor(private val messageDao: MessageDao) {
val all: List<Message> get() = messageDao.getAll
fun insert(vararg messages: Message) {
messageDao.insert(*messages)
}
fun update(message: Message) {
messageDao.update(message)
}
fun delete(message: Message) {
messageDao.delete(message)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.