2017-06-12 319 views
1

我正在从Java转移到Kotlin以进行Android开发。我想检查EditText中的字段是否为空。所以,我试图让这个:kotlin验证输入字段

override fun checkFields() { 

    val username = username.text.toString().trim().takeUnless { username.text.isNullOrEmpty() } ?: presenter.usernameError() 
    val password = password.text.toString().trim().takeUnless { password.text.isNullOrEmpty() } ?: presenter.passwordError() 

    presenter.signInWithUsernameAndPassword(username as String,password as String) 
} 

,但这里有两个问题:

  1. 它也传递给signInWithUsernameAndPassword此外,如果用户名/密码为空
  2. 它崩溃,因为给我这个错误:

    java.lang.ClassCastException:kotlin.Unit不能转换为java.lang.String

为什么? takeUnless{}将字符串转换为单位?

谢谢

+0

您能否添加更多信息? 'presenter.usernameError()'方法也可能很有用。你也重新定义'username'和'password'这看起来不正确。 – tynn

+0

你的意思是抛出'preseneter.usernameError()'和'presenter.passwordError()'的返回值吗?如果是这样,你需要在'?:'之后将语句分别更改为'throw preseneter.usernameError()'和'throw presenter.passwordError()'。 – mfulton26

+0

usernameError()和showError()必须打开一个对话框,告诉用户该字段为空@tynn – ste9206

回答

2

该方法的第一条语句与Java中的以下内容类似。

String username = !username.text.isNullOrEmpty() ? username.text.toString().trim() : presenter.usernameError(); 

这就是为什么你得到了ClassCastException如果presenter.usernameError()是(在Java或void)功能的Unit -typed。我认为这不是你想要的。

条件是presenter.usernameError()presenter.passwordError()Unit -typed功能,可以

val username = username.text.toString().trim().takeUnless { it.isNullOrEmpty() } ?: return presenter.usernameError() 
val password = password.text.toString().trim().takeUnless { it.isNullOrEmpty() } ?: return presenter.usernameError() 

presenter.signInWithUsernameAndPassword(username as String,password as String) 

itusername.text.toString().trim()password.text.toString().trim(),其是称为takeUnless方法的实例。

+0

有一种方法可以避免调用signInWithUsernameAndPassword()如果其中一个字段为空? – ste9206

+1

它是从代码中的函数返回的。你看我在'?:'之后加了'return'。由于'checkFields()'的类型是'Unit',因此通过调用'Unit'类型的函数返回是安全的。它在将'Unit'值分配给'String'变量之前返回,所以它不会抛出强制异常。 – Naetmul

+0

是的,它工作的很好!非常感谢! – ste9206