android - Android ViewModelProvider() 参数错误
问题描述
我试图从 SharedViewModel 类中获取一个值,但是当我传递 requireActivity() 时 ViewModelProvider() 给出了一个参数错误,尽管我的片段中使用了相同的初始化和分配。
它要求传递“ViewModelStoreOwner”。
class CourseRepository(val app: Application) {
private var viewModel: SharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
val courseData = MutableLiveData<List<Course>>()
init {
CoroutineScope(Dispatchers.IO).launch {
callWebService()
}
}
@WorkerThread
suspend fun callWebService() {
if (Utility.networkAvailable(app)) {
val retrofit = Retrofit.Builder().baseUrl(WEB_SERVICE_URL).addConverterFactory(MoshiConverterFactory.create()).build()
val service = retrofit.create(CourseService::class.java)
val serviceData = service.getCourseData(viewModel.pathName).body() ?: emptyList()
courseData.postValue(serviceData)
}
}
}
这里 ViewModel 的目的是因为我存储了所选 RecyclerView 项目的 Id 以便将其发送到服务器
解决方案
ViewModel 实例的范围是片段或活动(或任何具有类似生命周期的东西),这就是为什么您需要将 a 传递ViewModelStoreOwner
给提供者以从中获取 ViewModel。ViewModel 的意义在于它们将一直存在,直到它们所属的商店被销毁。
该requireActivity
方法在这里不起作用,因为您不在 Fragment 中。
这里需要考虑的一些事情:
- 在这个用例中你真的需要 ViewModel 吗?您是否可以只使用可以通过调用其构造函数来创建的常规类?
- 你能从你的 ViewModel 调用这个存储库,并从那里传递你需要的任何参数吗?
推荐阅读
- python - 如何序列化objects.filter django的结果基于外键对象
- sql - 在 SQL 或 BigQuery 中将值“”转换为 null
- observable - RxJava:如何创建 rx.Single / rx.Observable 的任务图/工作流?
- windows-10 - 如何通过命令行为 Teradata 驱动程序设置 ODBC 连接?
- django - django ORM 与 asyncio
- java - @NotNull : 验证自定义消息不显示
- node.js - 无法使用节点和护照通过谷歌获取用户个人资料登录
- javascript - 无法直接在导出的模块上访问它
- java - 卡夫卡生产者巨大的内存使用量(泄漏?)
- opencv - Kinect v2 与 Openni 2 并与 OpenCV 3.1.0 一起显示