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

不能用剑柄,Android注入房刀

上官飞
2023-03-14

我正在尝试使用 Hilt 将房间 DAO 注入存储库。我正在使用以下代码:

def room_version = "2.2.6"
ext.hilt_version = '2.33-beta'

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
implementation "androidx.room:room-guava:$room_version"
testImplementation "androidx.room:room-testing:$room_version"

implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"

@Dao
interface SearchDAO {

    @Query("SELECT * FROM searches_table WHERE name LIKE '%' || :query || '%'")
    fun readSearches(query : String) : Flow<List<SearchItem>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertSearch(search : SearchItem)

    @Delete
    suspend fun deleteSearch(search: SearchItem)
}

数据库

@Database(
        entities = [SearchItem::class],
        version = 1
)
abstract class SearchesDatabase : RoomDatabase(){
    abstract fun getSearchesDao() : SearchDAO
}

供应商

@Module
@InstallIn(ActivityComponent::class)
object AppModule{
    @Singleton
    @Provides
    fun provideSearchDatabase(@ApplicationContext context : Context) =
        Room.databaseBuilder(context, SearchesDatabase::class.java, SEARCH_DATABASE_NAME)
            .fallbackToDestructiveMigration()
            .build()

    @Provides
    fun provideSearchDAO(appDatabase: SearchesDatabase): SearchDAO {
        return appDatabase.getSearchesDao()
    }
}

基础应用程序

@HiltAndroidApp
class BaseApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        //Timber.plant(Timber.DebugTree())
    }
}

存储库注入

class Repository @Inject constructor(
    val searchesDao : SearchDAO
){
...
}

问题是我收到以下错误:

[Dagger/MissingBinding]com.example.leagueapp.database。如果没有@Provides注释方法,则无法提供SearchDAO。公共抽象静态类SingletoC实现BaseApplication_GeneratedInjector

共有2个答案

皇甫智明
2023-03-14

请在应用模块类中编写以下代码。您只需要在@installIn()注释中编写SingletonComponent::class而不是ActivityComponent::类即可

@Module
@InstallIn(SingletonComponent::class)
object AppModule{
    @Singleton
    @Provides
    fun provideSearchDatabase(@ApplicationContext context : Context) =
        Room.databaseBuilder(context, SearchesDatabase::class.java, SEARCH_DATABASE_NAME)
            .fallbackToDestructiveMigration()
            .build()

    @Provides
    fun provideSearchDAO(appDatabase: SearchesDatabase): SearchDAO {
        return appDatabase.getSearchesDao()
    }
}
陈增
2023-03-14

简短的回答:任何@Singleton都必须安装在单例组件中。

解释:单例应该在他们所处的过程中生存。您的数据库是一个单例(可能应该是),但您正在使用 @InstallIn(ActivityComponent::class),它告诉 dagger 此模块中提供的所有内容都应限定为活动的生命周期;当活动死亡时,模块将死亡。

 类似资料:
  • 我使用匕首有一段时间了,现在开始迁移到剑柄,但我不明白注射activity和碎片的好处。在Dagger中,它是和类似于的东西 抱歉,如果这是个愚蠢的问题。

  • 我正在尝试为我的navControl ler提供匕首柄。但是我使用的方法不起作用。我想提供navControl ler以便通过构造函数注入将其注入我的片段中。 我还创建了FragmentWorks类,以便通过构造函数注入我的依赖项。我知道是这里的问题,但我不知道正确的解决方案… 感谢您的帮助,谢谢! 原因:java.lang.ClassCastException:com.example.app。应

  • 这是模块类 这是我的viewmodel构造函数 当我运行应用程序时,我得到这个错误,我认为不要在模块中注入所需的应用程序上下文,任何帮助都会被赞赏 C:\XYZ\XYZ\AndroidStudioProjects\CarAndroid\app\build\generate\source\kapt\debug\com\sw\car\baseclasses\CarApp_HiltComponents.

  • 我在房间使用关系中添加了一对多关系。我引用这篇文章是为了编写以下房间关系代码。 这篇文章讲述了如何从数据库中读取值,但将实体存储到数据库中会导致用户ID为空,这意味着这两个表之间没有关系。 我不确定在具有用户ID值的情况下,将用户和宠物列表插入数据库的理想方法是什么。 1)用户实体: 2) 宠物实体: 3)用户带宠物POJO: 现在,为了从DB中获取记录,我们使用以下DAO: 编辑 我已创建此问题

  • 我使用Dagger-Hilt进行依赖注入,但是我不知道如何在抽象类中进行字段注入。 [DI包] 我使用匕首剑柄(AppModule.kt)将“ErrorHandler”作为单例提供 扩展到BaseUseCase以上的用例都是为匕首剑柄(UseCaseModule.kt)编写的。 > 我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型

  • 几天来,我一直试图成功地构建我正在进行的项目(使用Jetpack Compose),但当我更新gradle构建插件和其他一些依赖项时,我无法正确运行该项目。有一些gradle版本与dagger-hilt依赖项冲突,我不知道如何修复它。我正在使用Android Studio的金丝雀测试版。 这里还有我所有的gradle构建文件: Gradle构建模块应用程序: Gradle构建(项目层级): 错误: