2017-06-12 10 views
1

Ich ziehe von Java nach Kotlin für meine Android-Entwicklung. Ich möchte überprüfen, ob ein Feld in EditText leer ist oder nicht. Also habe ich versucht, dies zu machen:kotlin verifiziere Eingabefelder

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) 
} 

aber es gibt zwei Probleme:

  1. es geht auch auf die signInWithUsernameAndPassword auch wenn Benutzername/Passwort leer
  2. stürzt, weil mir gibt dieser Fehler:

    java.lang.ClassCastException: kotlin.Unit nicht java.lang.String gegossen werden kann

warum? takeUnless{} wandelt String in Einheit um?

Dank

+0

Können Sie weitere Informationen hinzufügen? Die 'presenter.usernameError()' Methode könnte ebenfalls von Interesse sein. Außerdem definieren Sie 'Benutzername' und' Passwort' neu, was nicht richtig erscheint. – tynn

+0

Wollten Sie die Rückgabewerte von 'preseneter.usernameError()' und 'presenter.passwordError()'? Wenn ja, müssen Sie Ihre Anweisungen nach '?:' In 'throw preseneter.usernameError()' und 'throw presenter.passwordError()' ändern. – mfulton26

+0

usernameError() und showError() müssen eine Dialog-Warnung geöffnet werden, um dem Benutzer zu zeigen, dass das Feld leer ist. @tynn – ste9206

Antwort

2

Die erste Anweisung in dem Verfahren ist wie folgt in Java.

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

diesem Grund sollten Sie die ClassCastException, wenn presenter.usernameError() ist ein Unit -typed (oder void in Java) -Funktion. Ich denke, das ist nicht das, was du willst.

Vorausgesetzt, dass beide presenter.usernameError() und presenter.passwordError()Unit -typed Funktionen sind, können Sie

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) 

it bezieht sich auf username.text.toString().trim() oder password.text.toString().trim(), die die Instanzen sind, die takeUnless Methode aufgerufen.

+0

gibt es eine Möglichkeit, signInWithUsernameAndPassword() zu vermeiden, wenn eines der beiden Felder leer ist? – ste9206

+1

Es wird von der Funktion im Code zurückgegeben. Sie sehen, dass ich 'return' nach '?:' Hinzugefügt habe. Da der Typ von 'checkFields()' 'Unit' ist, ist es sicher, mit dem Aufruf einer Unit-typed-Funktion zurückzukehren. Es wird zurückgegeben, bevor den 'String'-Variablen der 'Unit'-Wert zugewiesen wird, sodass die Cast-Ausnahme nicht ausgelöst wird. – Naetmul

+0

Ja, es funktioniert gut! Ich danke dir sehr! – ste9206