Android 从片段到viewModel的数据绑定未更改

Android 从片段到viewModel的数据绑定未更改,android,kotlin,mvvm,data-binding,dagger-hilt,Android,Kotlin,Mvvm,Data Binding,Dagger Hilt,我将视图模型中的用户字段绑定到视图,但没有发现问题 当我调试时,用户正在返回正确的数据并将其保存在变量中,如fun setUser()中所述,但更改没有绑定到视图。只有在init()中更改其中一个,它才会在视图中更改!!!!我错过了什么 以下是viewModel: class ProfileViewModel @ViewModelInject constructor(private val appRepository: AppRepository,

我将视图模型中的用户字段绑定到视图,但没有发现问题

当我调试时,用户正在返回正确的数据并将其保存在变量中,如fun setUser()中所述,但更改没有绑定到视图。只有在init()中更改其中一个,它才会在视图中更改!!!!我错过了什么

以下是viewModel:


    class ProfileViewModel  @ViewModelInject constructor(private val appRepository: AppRepository,
                                                              @Assisted private val savedStateHandle: SavedStateHandle
    ) :
            ViewModel() ,LifecycleObserver {
        var usertmp:User=User()
        var name: String = "hi"
        var mobile: String =  ""
        var mobile2: String = ""
        var password: String =  ""
        var address: String =  ""
        var balanceBegory:String =""
        var balanceEqlomat:String =""
        var studentLevel: String? = ""
        //var mTitleTV = savedStateHandle.getLiveData<String>("settingType").value
        var selectedData:String=""
    
    
        //clickable of button
        private val _isBtnAvailable = MutableLiveData<Boolean>()
        val isBtnAvailable: LiveData<Boolean>
            get() = _isBtnAvailable
        //to open main
        private val _isopenLogin = MutableLiveData<Boolean>()
        val isopenLogin: LiveData<Boolean>
            get() = _isopenLogin
        //progressbar
        private val _dataLoading = MutableLiveData<Boolean>()
        val dataLoading: LiveData<Boolean>
            get() = _dataLoading
        private val _ishideKeyboard = MutableLiveData<Boolean>()
        val ishideKeyboard: LiveData<Boolean>
            get() = _ishideKeyboard
    
        private val msnackbarText = MutableLiveData<Event<Int>>()
        val snackbarMessage: LiveData<Event<Int>>
            get() = msnackbarText
        private val msnackbarText2 = MutableLiveData<String>()
        val snackbarMessage2: LiveData<String>
            get() = msnackbarText2
    
        init {
            _ishideKeyboard.value = false
            _isBtnAvailable.value = true
            getUser()
    //        address="test"
        }
    
        private fun getUser() {
            appRepository.getUserLastUpdate(object:IRemoteDataSource.LoginCallback{
                override fun onResponse(user: User) {
                    name="yes"
                    setuser(user)
                }
                override fun onDataNotAvailable(message: Int?) {
                    name="No"
                }
    
            })
    
        }


类ProfileViewModel@ViewModelInject构造函数(私有val appRepository:appRepository,
@辅助私有val savedStateHandle:savedStateHandle
) :
ViewModel(),LifecycleObserver{
var usertmp:User=User()
变量名称:String=“hi”
var mobile:String=“”
var mobile2:String=“”
var密码:String=“”
变量地址:String=“”
var balanceBegory:String=“”
var balanceEqlomat:String=“”
变量studentLevel:字符串?=“”
//var mTitleTV=savedstateholder.getLiveData(“settingType”).value
var selectedData:String=“”
//可点击的按钮
private val_isbtnavaailable=MutableLiveData()
val isBtnAvailable:LiveData
get()=\u isbtnavable
//打开主管道
private val_isopenLogin=MutableLiveData()
val isopenLogin:LiveData
get()=\u isopenLogin
//进度条
private val_dataload=MutableLiveData()
val数据加载:LiveData
get()=\u数据加载
private val_ishideKeyboard=MutableLiveData()
val ishideKeyboard:LiveData
get()=\u键盘
private val msnackbarText=MutableLiveData()
val snackbarMessage:LiveData
get()=msnackbarText
private val msnackbarText2=MutableLiveData()
val snackbarMessage2:LiveData
get()=msnackbarText2
初始化{
_ishideKeyboard.value=false
_isbtnavaailable.value=true
getUser()
//地址=“测试”
}
私人娱乐用户(){
appRepository.getUserLastUpdate(对象:IRemoteDataSource.LoginCallback{
覆盖响应(用户:用户){
name=“是”
设置用户(用户)
}
覆盖数据不可用(消息:Int?){
name=“否”
}
})
}
为了碎片



   @AndroidEntryPoint
   class ProfileFragment : Fragment(R.layout.fragment_profile),ProfileNavigator {
       private lateinit var binding:FragmentProfileBinding
   
       private val mLevelsList: ArrayList<Level> = ArrayList<Level>()
   
       private  val profileViewModel: ProfileViewModel by viewModels()
       override fun onCreateView(
               inflater: LayoutInflater,
               container: ViewGroup?,
               savedInstanceState: Bundle?
       ): View? {
           Log.d(ContentValues.TAG, "showMessage: create profile")
           binding = FragmentProfileBinding.inflate(inflater, container, false)
           val view = binding.root
           binding.profileViewModel=profileViewModel
           binding.lifecycleOwner = this
           subscribeToNavigationChanges(profileViewModel)
           return view
       }
   ```
for profile fragment XML:

@雄蕊识别点
类ProfileFragment:Fragment(R.layout.Fragment\u profile),ProfileNavigator{
私有lateinit变量绑定:FragmentProfileBinding
private val mLevelsList:ArrayList=ArrayList()
private val profileViewModel:profileViewModel by viewModels()
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
Log.d(ContentValues.TAG,“showMessage:createprofile”)
绑定=碎片绑定。充气(充气机、容器、假)
val view=binding.root
binding.profileViewModel=profileViewModel
binding.lifecycleOwner=此
subscribeToNavigationChanges(profileViewModel)
返回视图
}
```
对于配置文件片段XML:

```
<?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>
    <import type="android.view.View" />
    <variable
        name="profileViewModel"
        type="com.attendance.myproject.begory.presentationLayer.main.profile.ProfileViewModel"
        />
  </data>

  <ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
      <RelativeLayout
          android:layout_width="match_parent"
          android:layout_height="300dp"
          android:background="@color/primaryLightColor"
          android:padding="20dp">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/profile_image"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:scaleType="centerCrop"
            android:src="@drawable/p1"
            app:civ_border_color="#591EC1"
            android:layout_centerVertical="true"
            app:civ_border_width="5dp" />

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toEndOf ="@id/profile_image"
            android:layout_marginStart="10dp"
            android:text="@{profileViewModel.name}"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="@color/white"
            />
        <TextView
            android:id="@+id/tv_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{profileViewModel.studentLevel}"
            android:textSize="14sp"
            android:layout_toEndOf="@id/profile_image"
            android:layout_marginStart="10dp"
            android:layout_below="@id/tv_name"
            android:textColor="@color/white"
            />

        <ImageView
            android:layout_width="54dp"
            android:layout_height="43dp"

            android:layout_alignParentEnd="true"
            android:layout_marginEnd="20dp"
            android:src="@drawable/logout"
            android:onClick="@{()-> profileViewModel.logout()}"
            android:tint="@color/secondaryLightColor"/>

      </RelativeLayout>
      
      <LinearLayout
          android:layout_height="wrap_content"
          android:layout_width="match_parent"
          android:orientation="vertical"
          android:padding="20dp">
        <com.google.android.material.textfield.TextInputLayout
            android:hint="Name"
            android:id="@+id/ti_Name"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">

          <com.google.android.material.textfield.TextInputEditText
              android:drawablePadding="10dp"
              android:layout_height="wrap_content"
              android:layout_width="match_parent"
              android:text="@={profileViewModel.name}"
              />

        </com.google.android.material.textfield.TextInputLayout>
        <com.google.android.material.textfield.TextInputLayout
            android:hint="Password"
            android:id="@+id/ti_password"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">

          <com.google.android.material.textfield.TextInputEditText
              android:drawablePadding="10dp"
              android:layout_height="wrap_content"
              android:layout_width="match_parent"
              android:text="@={profileViewModel.password}"
              />

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:hint="Address"
            android:id="@+id/ti_address"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">

          <com.google.android.material.textfield.TextInputEditText
              android:drawablePadding="10dp"
              android:layout_height="wrap_content"
              android:layout_width="match_parent"
              android:text="@={profileViewModel.address}"
              />

        </com.google.android.material.textfield.TextInputLayout>
        <com.google.android.material.textfield.TextInputLayout
            android:hint="Parent Mobile"
            app:hintTextColor="@color/progress_center"
            android:id="@+id/ti_mobile2"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">

          <com.google.android.material.textfield.TextInputEditText
              android:drawablePadding="10dp"
              android:layout_height="wrap_content"
              android:layout_width="match_parent"
              android:text="@={profileViewModel.mobile2}"
              />

        </com.google.android.material.textfield.TextInputLayout>
   ```