当前位置: 首页 > 知识库问答 >
问题:

Android Dagger 2某些构造函数无法注入ViewModel

师向文
2023-03-14

我想将我的房间存储库和Rest存储库注入到我的ViewModel类中。然而,我可以注入rest存储库,但当我尝试注入room存储库时,它会出错。

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)]me.ibrahimsn.capsules.data.local.message.如果没有@Provides-anttated方法,则无法提供Message道。

编辑:解决方案https://stackoverflow.com/a/51783147/10203775

共有1个答案

伊俊能
2023-03-14

我解决了这个问题,谢谢。。

@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)
    }
}
 类似资料:
  • 问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -

  • 本文向大家介绍Design patterns 构造函数注入(C#),包括了Design patterns 构造函数注入(C#)的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空