按文档实现ViewModel+Repository架构时遇实例创建异常求助
解决「Cannot create an instance of class MyApplication」错误
核心问题原因
Android系统启动应用时,会通过无参构造函数自动实例化Application类。但你定义的MyApplication仅提供了带MedicamentoRepository参数的构造函数,系统无法自动注入该依赖,导致无法创建Application实例,触发该异常。
分步解决方案
1. 重构MyApplication类,使用无参构造并初始化完整依赖链
在Application内部完成从Room数据库到Repository的全链路实例初始化,保证依赖单例且完整:
import android.app.Application import androidx.room.Room class MyApplication : Application() { // 延迟初始化Room数据库单例 private val db by lazy { Room.databaseBuilder( applicationContext, MedicamentoDatabase::class.java, // 需确保已定义该Room数据库类 "medicamento_db" ).build() } // 初始化Dao private val medicamentoDao by lazy { db.medicamentoDao() } // 初始化DataSource private val medicamentoDataSource by lazy { MedicamentoDataSource(medicamentoDao) } // 初始化Repository val medicamentoRepository by lazy { MedicamentoRepository(medicamentoDataSource) } // 必须保留无参构造函数,供系统调用 constructor() : super() }
2. 补充Room数据库类定义(缺失的必要代码)
若尚未定义Room数据库类,需添加如下代码:
import androidx.room.Database import androidx.room.RoomDatabase @Database(entities = [Medicamento::class], version = 1) abstract class MedicamentoDatabase : RoomDatabase() { abstract fun medicamentoDao(): MedicamentoDao }
3. 清理build.gradle中的重复依赖
你的依赖存在重复项(如androidx.core:core-ktx、com.google.android.material:material),删除重复项避免冲突:
dependencies { def room_version = '2.5.1' implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" // Lifecycle组件 implementation 'androidx.activity:activity-ktx:1.7.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.1' implementation 'androidx.fragment:fragment-ktx:1.5.7' // 注意:lifecycle-extensions已废弃,建议使用官方推荐的独立组件替代 // implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
4. 验证ViewModel Factory使用逻辑
你的ViewModel Factory代码逻辑无误,只要MyApplication能正常实例化,即可获取Repository。确保在Activity/Fragment中通过Factory获取ViewModel:
// 在Activity中获取ViewModel示例 val viewModel: MedicamentoViewModel by viewModels { MedicamentoViewModel.Factory }
额外提示
- 避免在Application构造函数中执行耗时操作,使用
lazy延迟初始化可保证应用启动性能 - 废弃的
lifecycle-extensions组件建议替换为官方推荐的独立组件(如lifecycle-viewmodel、lifecycle-livedata等)
内容的提问来源于stack exchange,提问作者gise
相关产品推荐
相关产品推荐

