【问题标题】:Why does my function return kotlin.Unit and not a boolean?为什么我的函数返回 kotlin.Unit 而不是布尔值?
【发布时间】:2021-11-18 16:07:23
【问题描述】:

我已经创建了一个注册屏幕,并且正在使用 ROOM 数据库来存储用户。我成功地将它们添加到数据库中。我正在尝试对条目进行一些验证,因为我不希望用户拥有相同的用户名或电子邮件。这是我将它们添加到数据库的代码以及我如何验证它。


这是将名字、姓氏、用户名、密码、地址、城市、邮政编码、电子邮件、电话发送到数据库的函数。

mCustomerViewModel.addCustomer(customer),返回一个布尔值:

  1. 如果是真的用户添加

  2. 如果为假,则重复用户

    val customer = Customer(0, firstName, lastName, userName, password,address,city,postalCode,email,phone)
    val flag = mCustomerViewModel.addCustomer(customer)
    println("FLAG ---> "+flag)
    
    if(flag.equals(true)){
        Toast.makeText(applicationContext, "Success", Toast.LENGTH_SHORT).show()
    }else{
        Toast.makeText(applicationContext, "Failed", Toast.LENGTH_SHORT).show()
    }
    

这是CustomerViewModel 类:

fun addCustomer(customer: Customer){
    viewModelScope.launch(Dispatchers.IO){
        repository.addCustomer(customer) // call to CustomerRepository 
    }

然后从CustomerViewModel类,我们调用CustomerRepository

fun addCustomer(customer: Customer): Boolean {
    try {
        customerDao.addCustomers(customer)
        return true
    }catch (ex: Exception){
        return false
    }
}

如您所见,在添加客户的函数中,我有一个打印语句 println("FLAG ---> "+flag) 来检查函数返回的内容。我在控制台中得到了这个:

当我运行应用程序时,if 语句不会运行,只有 else 块会运行,因为“flag”实际上不等于“true”。

我该如何解决这个问题?

【问题讨论】:

  • 由于您的存储库 addCustomer 函数不是挂起函数(它应该是),您可以简单地删除 viewModelScope.launch 调用并直接将 repo 结果从视图返回给调用者模型。
  • 我原来确实有“suspend”,但是android studio不喜欢那里,让我remove redundant suspend。
  • 该警告是因为您的 Dao 函数可能没有标记为 suspend。
  • 我已经用建议的更改更新了问题,但现在我遇到了一个新错误
  • @navsharma 没关系,谢谢。我知道你是新来的,所以你不习惯这些惯例。一般来说,这里关于问题的所有规则和指南以及投票系统,都与使它们对未来的读者尽可能有用的目标有关,而不仅仅是对提出问题的人有用。如果以前没有人问过,请随时就您的新问题提出一个新问题。

标签: kotlin android-room


【解决方案1】:

您的addCustomer 函数启动一个协程并且不返回任何内容(隐式单元除外)。请注意,您没有定义任何返回类型。非挂起函数不可能返回已启动协程的结果,因为它在协程运行之前返回。你应该把它变成一个挂起函数,直接调用repository.addCustomer(customer)而不启动另一个协程,或者你可以给它一个回调参数,以便在启动的协程结束时调用。

第三个选项是将viewModelScope.launch 更改为return viewModelScope.async 并使函数返回类型Deferred<Boolean>。然后当你需要结果时,你可以在协程中调用 Deferred 上的await()。

【讨论】:

  • 我已经用建议的更改更新了问题,但现在我遇到了一个新错误
猜你喜欢
  • 2015-02-19
  • 2013-08-10
  • 2014-03-14
  • 2020-05-12
  • 1970-01-01
  • 2020-03-21
  • 2013-02-24
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多