2017-06-12 261 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