gpt4 book ai didi

首次更新后 Android LiveData Observer 未激活

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:36 24 4
gpt4 key购买 nike

我正在像这样使用 Kotlin 尝试架构组件的实时数据的基本实现:

class MarketFragment : LifecycleFragment(){
......
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel=ViewModelProviders.of(this).get(MarketViewModel::class.java)
viewModel.book?.observe(this, Observer { book-> //updateUI })
....

我的 ViewModel 类是这样创建的:

class MarketViewModel : ViewModel()
{
var book: MutableLiveData<Book>? =MutableLiveData()
var repository: Repository?= Repository()

init {
update("parameter")
}

fun update(s: String)
{
book=repository?.getBook(s)

}

}

还有我的存储库:

fun getBook(bookSymbol:String):MutableLiveData<Book>
{
val book=MutableLiveData<Book>()
......

call . enqueue (object : Callback<Book> {
override fun onResponse(call: Call<Book>?, response: Response<Book>?) {

book.value=response?.body()

}
.....
})
return book
}

所有这一切都非常有效,UI 也得到了应有的更新,但只是第一次。如果我尝试手动调用以从 UI 操作更新 viewModel,改造调用仍会按预期工作,但新数据不会发送到 fragment 中的观察者:

//this doesn't work:
viewModel.update("string")
//This returns false:
viewModel.book.hasActiveObservers()

Observer 在第一次触发后变为非 Activity 状态是预期的行为吗?

最佳答案

每次调用 getBooks 时都会创建一个新的 MutableLiveData 实例

因此您的观察者不再观察正确的 LiveData

解决这个问题

  1. 您的 ViewModel 应该只保留一个(不可变的)LiveData 实例
  2. 不可变的 LiveData 实例可以是:

    • 一个 MediatorLiveData,来源是存储库的 LiveData
    • 存储库 LiveData 的转换

这意味着存储库方法 getBooks 仅在 ViewModel 初始化时被调用一次,并且要么刷新自身,要么您必须调用存储库上的另一个方法来触发刷新。

关于首次更新后 Android LiveData Observer 未激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com