适配Sunflower教程代码时Hilt报错:未实现抽象方法求助
问题根源
你错误地将Hilt的@Module和@InstallIn注解直接加在了Room的@Dao接口上。Hilt会把标注了@Module的类/接口当作依赖绑定模块处理,要求模块内的抽象方法必须用@Binds或@Provides提供实现,但Room的Dao实现是由Room框架动态生成的,并非手动实现,因此Hilt无法找到这些方法的实现,触发报错。
解决方案
1. 修正WorkoutDao注解
移除Dao接口上的Hilt模块相关注解,只保留Room的@Dao:
import androidx.room.Dao import androidx.room.Query import androidx.room.Upsert import kotlinx.coroutines.flow.Flow @Dao interface WorkoutDao { @Query("SELECT * FROM workouts ORDER BY title") fun getWorkouts(): Flow<List<Workout>> @Query("SELECT * FROM workouts WHERE id = :workoutId") fun getWorkout(workoutId: String): Flow<Workout> @Upsert suspend fun upsertAll(workouts: List<Workout>) }
2. 创建Room数据库类
定义包含Dao的Room数据库抽象类:
import androidx.room.Database import androidx.room.RoomDatabase @Database(entities = [Workout::class, Routine::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun workoutDao(): WorkoutDao abstract fun routineDao(): RoutineDao }
3. 创建单独的Hilt数据库模块
通过独立的Hilt模块提供数据库实例,并暴露Dao:
import android.content.Context import androidx.room.Room import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object DatabaseModule { @Provides @Singleton fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase { return Room.databaseBuilder( context, AppDatabase::class.java, "app_database" ).build() } @Provides fun provideWorkoutDao(database: AppDatabase): WorkoutDao { return database.workoutDao() } @Provides fun provideRoutineDao(database: AppDatabase): RoutineDao { return database.routineDao() } }
4. 调整WorkoutRepository(可选)
如果需要在Repository中使用WorkoutDao,直接通过构造注入即可:
import javax.inject.Inject import javax.inject.Singleton @Singleton class WorkoutRepository @Inject constructor( private val routineDao: RoutineDao, private val workoutDao: WorkoutDao // 按需添加 ) { // 现有方法... // 示例:添加获取Workouts的方法 fun getWorkouts() = workoutDao.getWorkouts() }
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

