观察变量和函数有什么区别
Whats the difference between observing a variable and a function
当我从片段 A 观察我的视图模型中的一个变量时
val fetchTopicsList = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
}catch (e:Exception){
emit(Resource.Failure(e))
}
}
然后我导航到片段 B 并返回到片段 A,观察者将再次触发,但不会获取新数据。
现在,如果我将该声明更改为函数声明
fun fetchTopicsList() = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
}catch (e:Exception){
emit(Resource.Failure(e))
}
}
当我做同样的事情时(从片段 A 到片段 B 然后回来)观察者将再次触发并再次从服务器拉取数据。
为什么函数再次触发而变量只保留第一个获取的数据?
您可能实际上想要 MutableLiveData
的单个实例,它会在某些交互中发出,但我想直接解决您的问题:
有了这个函数,每次调用都会给你一个新的 LiveData
实例,而使用 属性 初始化器会实例化+将它设置为 LiveData
的单个实例,当你class 被实例化。这意味着,如果您的 属性 在 ViewModel
上,它将在配置更改和暂停/恢复周期中存活,直到它被销毁。
如果您更喜欢 属性 语法,您可以通过重写 getter 使其与每次重新调用函数时做同样的事情,但老实说,这里的函数在语法上更准确.
这就是使用 属性 语法实现相同功能的方法:
val fetchTopicsList: LiveData<..>
get() = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
} catch (e:Exception){
emit(Resource.Failure(e))
}
}
同样,更好的方法可能是单个 MutableLiveData
并在 ViewModel
上公开一个函数来发出请求和 post 任何订阅者的价值。
当我从片段 A 观察我的视图模型中的一个变量时
val fetchTopicsList = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
}catch (e:Exception){
emit(Resource.Failure(e))
}
}
然后我导航到片段 B 并返回到片段 A,观察者将再次触发,但不会获取新数据。
现在,如果我将该声明更改为函数声明
fun fetchTopicsList() = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
}catch (e:Exception){
emit(Resource.Failure(e))
}
}
当我做同样的事情时(从片段 A 到片段 B 然后回来)观察者将再次触发并再次从服务器拉取数据。
为什么函数再次触发而变量只保留第一个获取的数据?
您可能实际上想要 MutableLiveData
的单个实例,它会在某些交互中发出,但我想直接解决您的问题:
有了这个函数,每次调用都会给你一个新的 LiveData
实例,而使用 属性 初始化器会实例化+将它设置为 LiveData
的单个实例,当你class 被实例化。这意味着,如果您的 属性 在 ViewModel
上,它将在配置更改和暂停/恢复周期中存活,直到它被销毁。
如果您更喜欢 属性 语法,您可以通过重写 getter 使其与每次重新调用函数时做同样的事情,但老实说,这里的函数在语法上更准确.
这就是使用 属性 语法实现相同功能的方法:
val fetchTopicsList: LiveData<..>
get() = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
emit(repo.getIdeas())
} catch (e:Exception){
emit(Resource.Failure(e))
}
}
同样,更好的方法可能是单个 MutableLiveData
并在 ViewModel
上公开一个函数来发出请求和 post 任何订阅者的价值。