如何在Activity中正确实例化ViewModelFactory?
正确在Activity中实例化ViewModelFactory的方法
你的代码存在两个核心问题:一是创建了DiaryViewModelFactory但并未传递给ViewModelProvider,二是没有正确获取diaryDao实例。以下是完整的修正方案:
1. 补全ViewModelFactory的构造函数
首先确保DiaryViewModelFactory类有接收diaryDao的构造函数:
class DiaryViewModelFactory(private val diaryDao: DiaryDao) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(DiaryViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return DiaryViewModel(diaryDao) as T } throw IllegalArgumentException("Unknown ViewModel class") } }
2. 在Activity中正确获取依赖并实例化
在主Activity中,先获取自定义Application实例,再从中拿到数据库和DAO,最后结合工厂实例化ViewModel:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 1. 获取自定义Application实例,拿到database和diaryDao val app = application as YourCustomApplication // 替换成你实际的Application类名 val diaryDao = app.database.diaryDao // 2. 创建ViewModelFactory实例 val viewModelFactory = DiaryViewModelFactory(diaryDao) // 3. 传入factory给ViewModelProvider,获取ViewModel实例 val viewModel = ViewModelProvider(this, viewModelFactory)[DiaryViewModel::class.java] } }
3. 确保Application类的完整性
你的Application类需要明确类名,比如:
class YourCustomApplication : Application() { val database : DiaryDatabase by lazy { DiaryDatabase.getDatabase(this) } }
同时记得在AndroidManifest.xml中注册这个Application:
<application android:name=".YourCustomApplication" <!-- 其他配置项 --> >
关键要点
- 必须将创建好的
ViewModelFactory传入ViewModelProvider的构造函数,否则系统无法用你的工厂创建ViewModel实例 - 不能直接使用未初始化的
diaryDao变量,必须通过Application的懒加载数据库获取合法的DAO实例 - 确保
DiaryViewModel类的构造函数正确接收diaryDao参数:
class DiaryViewModel(private val diaryDao: DiaryDao) : ViewModel() { // 你的ViewModel业务逻辑 }
内容的提问来源于stack exchange,提问作者Kiran Kittu
相关产品推荐
相关产品推荐

