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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:05:20