【问题标题】:Android ViewModelProvider() parameter errorAndroid ViewModelProvider() 参数错误
【发布时间】:2020-04-29 18:13:55
【问题描述】:

我试图从 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 以便将其发送到服务器

【问题讨论】:

    标签: android kotlin android-viewmodel viewmodelproviders


    【解决方案1】:

    ViewModel 实例的范围为 Fragments 或 Activities(或任何具有类似生命周期的东西),这就是为什么您需要将 ViewModelStoreOwner 传递给提供者以从中获取 ViewModel。 ViewModel 的意义在于,它们将一直存在,直到它们所属的商店被销毁。

    requireActivity 方法在这里不起作用,因为您不在 Fragment 中。

    这里需要考虑的一些事情:

    • 在这个用例中你真的需要 ViewModel 吗?您是否可以只使用可以通过调用其构造函数来创建的常规类?
    • 您能否您的 ViewModel 调用此存储库,并从那里传入您需要的任何参数?

    【讨论】:

    • 我将所选 RecyclerView 项目的 ID 存储在 SharedViewModel 类中,以便通过 http post 请求发送它,以根据该选择过滤我在服务器上的 SQL 请求
    • 我想我不需要使用 ViewModel,但是如何将所选 RecyclerView 项目的 Id 传递给 http 帖子?
    • 你不是从 ViewModel 调用这个存储库吗?你能把它作为参数添加到callWebService吗?
    • 我没有从视图模型调用这个存储库
    • 我想做的只是将 ReyclerViewItem Id 放入 getCourseData() 函数
    猜你喜欢
    • 2021-07-14
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多