我正在尝试使用 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
请在应用模块类中编写以下代码。您只需要在@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()
}
}
简短的回答:任何@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构建(项目层级): 错误: