在Activity
中绑定一个ViewModel
,
Fragments
间共用这个ViewModel
,
使用Naviagtion
来切换Fragment
间的页面时,
每次切换都会重走一次Fragment
的生命周期,
也就是处於“STARTED 或 RESUMED 状态”,
导致从其他页面切换回来之後,
会触发LiveData
的数据回调(observer被触发)。
在Activity
中保存一个ViewModel
,
使用Navigation
和Fragment
实现页面的切换,
AFragment
获取Activity
的ViewModel
并注册LiveData
为observer
,
此时使用setValue
让AFragment
收到一次LiveData
数据,
然後切换到BFragment
(AFragment
被销毁),
之後切回AFragment
,会发现重新注册LiveData
数据,
AFragment
再次收到LiveData
数据。
图源:https://bbs.huaweicloud.com/blogs/detail/256402
新增一个Event
class
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
}
用Event
包装你原本的data。
ViewModel
层 val selectedDate: LiveData<Event<String?>>
get() = _selectedDate
private val _selectedDate = MutableLiveData<Event<String?>>()
fun setSelectedDate(date: String?) {
_selectedDate.value = Event(date)
}
Fragment
层 viewModel.selectedDate.observe(viewLifecycleOwner, {
it.getContentIfNotHandled()?.apply { result ->
tv_selectedDate.text = result
}
})
透过getContentIfNotHandled
取得Event
中原本的LiveData
,
能够抓取正确值,
而不会一直被Fragment
间切换影响而重复调用。
参考:
<<: # Day 8 Why the “volatile” type class should not be used
Hi Da Gei Ho~ 初次见面,我是Winnie~ 我是一位刚转职六个月的菜鸟前端(前身是网页...
3-7 对立的鸡群们 在飞哥的工作室也待好一阵子的小博,这天在网路上收集资料,以便帮飞哥在报告上有更...
你喜欢什麽类型? | 实质的那一种 | $$$$$$爱了 🐄点此填写今日份随堂测验 ...
「验收测试的目的是沟通、澄清及精确化。从专业开发人员的眼光来看,与业务方、测试方协同工作,确保大家...
「最近眼睛都一直盯着电脑,超酸的」 「而且这台萤幕还坏掉,不能调整亮度」 这样啊 ... 辛苦了,...