Android Kotlin Room 数据库。从 ViewModel 调用时查询失败。通过 App Inspection window

Android Kotlin Room database. Query fails when called from ViewModel. Passes from App Inspection window

我有一个使用片段、导航和视图模型的应用程序。我无法从我的视图模型 (CustomerViewModel.kt) 调用查询“getCustomerById”。 更多细节: 我正在从打开 CustomerDetailFragment 并显示有关客户的详细信息的 CustomerFragment 中选择客户。我为这两个片段使用了一个通用的 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()。 “挂起函数 'first' 只能从协程或另一个挂起函数中调用”

“getCustomerCount”存在同样的问题。由于我对协同程序缺乏了解,我花了几个小时或几天的时间。我无法从原始应用程序中添加代码,因此我在 github 上添加了一个简化的应用程序。 link 如下。 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。

您需要启动协程来调用 suspend 函数 Flow.first()。在 ActivityFragment 中,您可以使用 lifecycleScope, in 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
    }
}