0

我想在Android中使用數據綁定。但最終得到StackOverflow錯誤。getter方法拋出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

你應該在你的getter使用field爲好,否則會遞歸調用自身:

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

你遞歸調用,吸氣。你應該寫

get() = field 

,而不是

get() { 
    return userEmailAddress 
} 

field標識的屬性的訪問用來提供訪問backing field,參照userEmailAddress結束調用getUserEmailAddress()方法導致無限循環和StackOverflowError