You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:03:42