如何在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
相关产品推荐
相关产品推荐

