目前,我正在使用这个:
class AutoClearedValue<T : Any>(val fragment: Fragment) : ReadWriteProperty<Fragment, T> {
private var _value: T? = null
init {
fragment.lifecycle.addObserver(object: DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
fragment.viewLifecycleOwnerLiveData.observe(fragment) { viewLifecycleOwner ->
viewLifecycleOwner?.lifecycle?.addObserver(object: DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) {
_value = null
}
})
}
}
})
}
override fun getValue(thisRef: Fragment, property: KProperty<*>): T {
return _value ?: throw IllegalStateException(
"should never call auto-cleared-value get when it might not be available"
)
}
override fun setValue(thisRef: Fragment, property: KProperty<*>, value: T) {
_value = value
}
}
/**
* Creates an [AutoClearedValue] associated with this fragment.
*/
fun <T : Any> Fragment.autoCleared() = AutoClearedValue<T>(this)
但在我看来,因为我们需要在 DestroyView() 中 _binding = null
init部分应该是:
override fun onDestroyView(owner: LifecycleOwner) {
super.onDestroyView(owner)
_value = null
}
但在我的课上,它只是:
override fun onDestroy(owner: LifecycleOwner) {
_value = null
}
但是
DefaultLifecycleObserver
中不存在onDestroyView。我怎样才能做到这一点?
Fragment.viewLifecycleOwner.lifecycle.addObserver(…)
,DefaultLifecycleObserver.onDestory(…)
将与Fragment.onDestoryView(…)
同时被调用。Fragment.lifecycle.addObserver(…)
,DefaultLifecycleObserver.onDestory(…)
将与Fragment.onDestory(…)
同时被调用。这是一个例子。
override fun onViewCreated(…) {
viewLifecycleOwner.lifecycle.addObserver(
object : DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) {
println("Fragment.onDestroyView() is called.")
}
}
)
lifecycle.addObserver(
object : DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) {
println("Fragment.onDestroy() is called.")
}
}
)
}