簡體   English   中英

Android Dagger 2一些構造函數無法注入ViewModel

[英]Android Dagger 2 Some Constructors can't Inject into ViewModel

我想將我的Room Repository和Rest Repository注入到ViewModel類中。 但是,我可以注入其余存儲庫,但是當我嘗試注入空間存儲庫時,它會出錯。

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() {

}

錯誤是這樣的:

錯誤:[dagger.android.AndroidInjector.inject(T)]如果沒有@Provides注釋的方法,則無法提供me.ibrahimsn.capsules.data.local.message.MessageDao。

編輯:解決方案https://stackoverflow.com/a/51783147/10203775

我解決了這個問題,謝謝..

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM