【问题标题】:Android Kotlin Room database. Query fails when called from ViewModel. Passes from App Inspection windowAndroid Kotlin Room 数据库。从 ViewModel 调用时查询失败。应用检查窗口通过
【发布时间】:2021-12-28 20:35:52
【问题描述】:

我有一个使用片段、导航和视图模型的应用。我无法从我的视图模型 (CustomerViewModel.kt) 中调用查询“getCustomerById”。 更多细节: 我从 CustomerFragment 中选择客户,这会打开 CustomerDetailFragment 并显示有关客户的详细信息。我对两个片段都使用了一个通用的 ViewModel。大多数事情都有效,但我无法让我的查询 (getCustmoerbyID) 从 CustomerDetailsFragment 工作。我有一个编译器错误。 代码如下所示。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val customer = customerViewModel.geCustomerById("11")
    Log.i(Constants.LOG_TAG, "Customer details fragment. ${customer.first().firstName}.  Done ** onViewCreated. **")
}

错误出现在日志语句中,对于方法 first()。 "挂起函数'首先'应该只从协程或另一个挂起函数中调用"

与“getCustomerCount”相同的问题。由于我对协程缺乏了解,我花了几个小时或几天的时间。我不能从原始应用程序中放置代码,所以我在 github 上放置了一个简化的应用程序。链接如下。 https://github.com/msyusuf。 ViewModel 是 CustomerViewModel。查询是

fun geCustomerById(cust_id: String) : Flow<Customer> { return repository.geCustomerById(cust_id) } 其他类是 CustomerDao.kt、CustomerRepository.kt、CustomerFragment、CustomerDetailsFragment.kt。

【问题讨论】:

  • 从 CustomerDetailsFragment 调用代码失败。

标签: android kotlin android-room kotlin-coroutines kotlin-flow


【解决方案1】:

你需要启动一个协程来调用suspend函数Flow.first()。在 ActivityFragment 中,您可以使用 lifecycleScope,在 ViewModel - viewModelScope 中启动协程。示例:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    lifecycleScope.launch {
        val customer = customerViewModel.geCustomerById("11")
        val name = customer.first()?.firstName;
        // ... use name
    }
}

【讨论】:

  • 您的回答确实解决了编译错误,但调用 customer.first().firstname 会导致异常。 java.lang.NullPointerException:尝试在 com.yusuf.customerapp.ui.customer.CustomerDetailsFragment$onViewCreated$1 的空对象引用上调用虚拟方法“java.lang.String com.yusuf.customerapp.Customer.getFirstName()”。 invokeSuspend(CustomerDetailsFragment.kt:58)
  • 可以使用问号'?'对于可为空的对象。编辑了我的答案。似乎客户不存在该 ID,或者您需要修改您的 SQL 请求。
  • 它正在工作。非常感谢。问题已经解决了。有没有办法说问题解决了?
  • 答案左侧有一个复选标记,可以点击它标记已解决的主题。
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2021-09-17
  • 2022-12-08
  • 1970-01-01
相关资源
最近更新 更多