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

如何在Kotlin中使用Hilt实现依赖注入及解决Room schema导出问题

Kotlin中Hilt依赖注入实现及Room Schema导出问题解决方案

一、Kotlin中使用Hilt实现依赖注入

1. 添加Hilt依赖配置

项目级构建文件(build.gradle/build.gradle.kts)

添加Hilt Gradle插件依赖:

// Groovy 版本
buildscript {
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48'
    }
}
// KTS 版本
buildscript {
    dependencies {
        classpath("com.google.dagger:hilt-android-gradle-plugin:2.48")
    }
}

模块级构建文件(app/build.gradle/app/build.gradle.kts)

启用插件并添加核心依赖:

// Groovy 版本
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.48'
    kapt 'com.google.dagger:hilt-compiler:2.48'
}
// KTS 版本
plugins {
    id("com.android.application")
    id("kotlin-android")
    id("kotlin-kapt")
    id("dagger.hilt.android.plugin")
}

dependencies {
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48")
}

2. 初始化Hilt

创建自定义Application类并标记@HiltAndroidApp注解,这会触发Hilt的代码生成:

@HiltAndroidApp
class MyApplication : Application()

在AndroidManifest.xml中指定该Application:

<application
    android:name=".MyApplication"
    ...>
    <!-- 其他配置 -->
</application>

3. 实现依赖注入

(1)标记可注入的类

通过@Inject注解标记类的构造函数,让Hilt自动管理实例创建:

class UserRepository @Inject constructor() {
    fun fetchUserInfo(): String = "Sample User Data"
}

(2)在组件中注入依赖

用@AndroidEntryPoint注解标记Activity/Fragment,然后通过@Inject注入依赖实例:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var userRepository: UserRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 使用注入的依赖
        Log.d("MainActivity", userRepository.fetchUserInfo())
    }
}

(3)自定义依赖模块(可选)

对于第三方类或无法修改构造函数的类,使用@Module和@Provides提供实例:

@Module
@InstallIn(SingletonComponent::class) // 全局单例作用域
object NetworkModule {
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder().build()
    }
}

二、Room Schema导出目录未配置问题解决方案

Room需要导出schema文件用于数据库版本管理,以下是两种解决方式:

方式1:配置Schema导出目录(推荐)

步骤1:应用Room Gradle插件

在模块级构建文件中添加插件:

// Groovy 版本
plugins {
    ...
    id 'androidx.room'
}
// KTS 版本
plugins {
    ...
    id("androidx.room")
}

步骤2:指定schema存储路径

在模块级构建文件的android块中配置注解处理器参数:

// Groovy 版本
android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }
}
// KTS 版本
android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["room.schemaLocation"] = "$projectDir/schemas"
            }
        }
    }
}

配置完成后,Room会将schema文件导出到项目根目录的schemas文件夹中。

方式2:关闭Schema导出(仅临时测试用)

在RoomDatabase类中设置exportSchema = false,但不建议在正式项目中使用(schema是数据库版本迁移的核心依据):

@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

内容的提问来源于stack exchange,提问作者Syed Saif Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:40:19