hi-dhl/Binding

Fragment生命周期监听方法不正确

start141 opened this issue · 4 comments

当前的监听方法通过fragment.lifecycle添加了Observer,
fragment.lifecycle关联的是fragment的生命周期,而非fragment.view的生命周期,

fragment.lifecycle.addObserver { destroyed() }

由于fragment.view活跃的生命周期存在明显比fragment活跃生命周期短的情况,
(如采用Navigation库管理fragment(attach/detach))
正确的做法是采用fragment.viewLifecycleOwner.lifecycle添加Observer。

Simple one-liner ViewBinding in Fragments and Activities with Kotlin
中fragment生命周期监听的方法是正确的
(其中onDestroy回调与fragment.onDestroyView()回调对应)

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) {
                    binding = null
                }
            })
        }
    }
})

PS: observers可以不额外手动remove,因为fragment.lifecycle和LiveData都在DESTROYED时做了反注册。

非常感谢, 你是对的, view 生命周期比 fragment 周期短,也确实存在多种情况, view 被销毁了,而fragment 依然存在,也可能会出现造成多个 Observer 的情况,而 ViewBinding 和 DataBinding 都是 View 相关的,应该使用 viewLifecycleOwner, 我会在下一个版本一起修复这个问题,再次感谢

我指的不是 binding 中添加 addObserver, 而是 fragment.lifecycle 和 fragment.viewLifecycleOwner 可能是会存在多个的,

非常感谢你的提交和建议,这个问题在 1.0.9 上修复了

registerFragmentLifecycleCallbacks 会不会更直观一点,不过注册时机需要在获取 value 的时候。