簡體   English   中英

更改值時未調用 LiveData 觀察者

[英]LiveData observer is not being called when changing value

當我更改LiveData值時,不會調用我的觀察者。 我有一個ViewModel ,一個自定義View和一個Fragment ViewModel中我設置LiveData ,在自定義View中我更改此LiveData的值,在Fragment中我觀察LiveData

使用斷點,我看到我的自定義View工作正常並正確更改LiveData值,但在Fragment中,僅在創建Fragment時調用觀察者。

視圖模型:

class MyViewModel : ViewModel {
  private val _myValue : MutableLiveData<Boolean> by lazy{
     MutableLiveData<Boolean>().apply{
         value = false
         }
     }
  val myValue : LiveData<Boolean> get() = _myValue

  fun setMyValue(checked: Boolean){
    _myValue.postValue(checked)
  }
}

自定義視圖:

    class MyCustomView @JvmOverloads constructor(ctx:Context,attrs:AttributeSet? = null): ConstraintLayout(ctx,attrs){

       private val viewmodel by lazy{
         ViewModelProvider(ViewTreeViewModelStoreOwner.get(this)!!).get<MyViewModel>()
       }
    
       init{
         setValue()
       }
    
       fun setValue(){
         if(something == true){
           viewmodel.setMyValue(true)
       }else{
          viewmodel.setMyValue(false)}
       }
    }
}

分段:

class Fragment :Fragment(){
      private val viewModel : MyViewModel by activityViewModels()
    
      override fun onViewCreated(view:View,savedInstanceState: Bundle?){
    
        super.onViewCreated(view,savedInstanceState)
        setUpObserver()
      }
    
      private fun setUpObserver(){
        viewModel.apply{
          myValue.observerInside{ myvalue->
            if(myValue)
               someFunction()
            else
               anotherFunction()

          } 
       }
     }
 }

解決了,我剛剛將Fragment中的ViewModel聲明更改為這個,現在它工作正常:

 private val viewmodel by lazy{
         ViewModelProvider(ViewTreeViewModelStoreOwner.get(binding.root)!!).get<MyViewModel>()
 }

在你的 Fragment 類中,你有

private fun setUpObserver(){
    viewModel.apply{
      myValue.observerInside{ myvalue->
        if(myValue)
           someFunction()
        else
           anotherFunction()

      } 
   }

改為這樣做

private fun setUpObserver(){
    viewModel.apply {
      myValue.observer { myvalue ->
        ...
      } 
   }
}

如中所示,將myValue.observerInside替換為myValue.observe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM