0

私はAndroidでデータバインディングを使用しようとしています。しかし、最終的にStackOverflowエラーを取得します。getterメソッドthrowing StackOverflowError

loginViewModel.kt

class loginViewModel(): BaseObservable() { 

    @Bindable 
    var errorEmail:String?=null 
     get() { 
      if (userEmailAddress.isNullOrBlank()) 
       return "Please Enter the Email Address" 
      else if (!isValidEmail(userEmailAddress)) 
       return "Enter Valid Email Id." 
      else 
       return null 
     } 

    var userEmailAddress:String= String() 
     set(userEmailAddress){ 
      field=userEmailAddress 
      notifyPropertyChanged(R.id.email_address) 
      /*to check Email for validation on every character inserted by user*/ 
      notifyPropertyChanged(BR.errorEmail) 

     } 
     get() { 
     return userEmailAddress 
    } 



} 

エラーログ:

07-04 13:54:15.435 6865-6865/com.example.itstym.reminder D/AndroidRuntime: Shutting down VM 
07-04 13:54:15.513 6865-6865/com.example.itstym.reminder E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.itstym.reminder, PID: 6865 
                      java.lang.StackOverflowError: stack size 8MB 
                       at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49) 
                       at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49) 

私は、任意の再帰呼び出しがあったときのStackOverflowエラーが発生知っているが、私はこのエラーを解決する方法を見つけ出すことができないのですか?

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools"> 

    <data class="ActivityMainBinding"> 
     <variable 
      name="login" 
      type="com.example.itstym.reminder.loginViewModel" /> 
    </data> 

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.itstym.reminder.MainActivity"> 


    <EditText 
     app:error="@{login.errorEmail}" 
     android:text="@{login.userEmailAddress}" 
     android:hint="Email Address" 
     android:id="@+id/email_address" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="8dp" 
     android:layout_marginStart="8dp" 
     android:ems="10" 
     android:inputType="textPersonName" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginTop="24dp"/> 


</layout> 

答えて

0

あなたはそれ以外の場合は、再帰的に自分自身を呼び出します、同様にあなたのゲッターでfieldを使用する必要があります。

var userEmailAddress: String = String() 
    set(userEmailAddress){ 
     field = userEmailAddress 
     ... 
    } 
    get() { 
     return field // <-- here 
    } 
1

あなたは再帰的にゲッターを呼んでいます。 userEmailAddressを参照すると、無限につながるgetUserEmailAddress()メソッドを呼び出して終了しているときは、

get() = field 

代わりの

get() { 
    return userEmailAddress 
} 

field識別子はbacking fieldへのアクセスを提供するために、プロパティのアクセサに使用されている記述する必要がありますループおよびStackOverflowError

関連する問題