android-fragments 更改值时未调用LiveData观察器

zc0qhyus  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(244)

当我改变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()

          } 
       }
     }
 }
axkjgtzd

axkjgtzd1#

解决了,我只是将Fragment中的ViewModel声明更改为以下内容,现在它工作正常:

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

yrefmtwq2#

在您的Fragment类中,您有

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

      } 
   }

改为执行此操作

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

例如,将***myValue.观察者内部***替换为***myValue.观察者***。

相关问题