【问题标题】:Android - DataBinding with LiveData hold old valuesAndroid - 带有 LiveData 的 DataBinding 保存旧值
【发布时间】:2020-08-06 15:25:36
【问题描述】:

我设置了 DataBinding 并使用 ViewPager BindingAdapter 在屏幕之间切换:

BindingAdapter

@BindingAdapter("app:nextPageListener") fun nextPageListener(viewPager: ViewPager, next: Boolean?) {
  next ?: return
  if (next) viewPager.nextPage()
  else viewPager.previousPage()
} 

View Pager

<ViewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:nextPageListener="@{viewModel.nextPageListener}"
    />

viewModel.nextPageListener

  private val _nextPageListener = MutableLiveData<Boolean>()
  val nextPageListener: LiveData<Boolean> get() = _nextPageListener

我的问题是,如果我调用 _nextPageListener.postValue(true) 并转到下一页并在某个时候离开屏幕,当我回来时,BindingAdapter 会自动调用 true,这会使寻呼机转到下一页.所以基本上在以下所有时间寻呼机都在第二个屏幕上打开。

不确定它是否与生命周期有关,但如果有帮助,这就是我所拥有的

binding.lifecycleOwner = viewLifecycleOwner

知道如何在没有一些丑陋的解决方法的情况下解决这个问题吗?

【问题讨论】:

    标签: android mvvm data-binding android-databinding android-livedata


    【解决方案1】:

    是的。你可以使用Event 类。

    open class Event<out T>(private val content: T) {
    
        var hasBeenHandled = false
            private set // Allow external read but not write
    
        /**
         * Returns the content and prevents its use again.
         */
        fun getContentIfNotHandled(): T? {
            return if (hasBeenHandled) {
                null
            } else {
                hasBeenHandled = true
                content
            }
        }
    
        /**
         * Returns the content, even if it's already been handled.
         */
        fun peekContent(): T = content
    }
    

    现在你可以像这样包装你的LiveData

       private val _nextPageListener = MutableLiveData<Event<Boolean>>()
    val nextPageListener: LiveData<Event<Boolean>> get() = _nextPageListener
    

    活动的最后一步。

    yourVm.nextPageListener.observe(this, Observer {
                it.getContentIfNotHandled()?.let {
                    when (it) {
    
                      //get Your value here.
                    }
                }
            })
    

    【讨论】:

    • 谢谢,但我实际上并没有观察到LiveData,它只是用于DataBinding 视图。我尝试改用SingleLiveEvent,但结果相同
    • 这种行为背后的主要原因是您之前的@​​987654329@ 实例没有被破坏,但您正在尝试创建另一个。您的viewmodel 提供程序代码在oncreate 方法中吗?
    • 我正在使用 Koin 库来注入它,但你可能是对的
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多