hi-dhl / Binding

Simple API implement DataBinding and ViewBinding. 简单的 API 实现 DataBinding 和 ViewBinding,欢迎 star
Apache License 2.0
425 stars 48 forks source link

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

Closed start141 closed 3 years ago

start141 commented 3 years ago

当前的监听方法通过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时做了反注册。

hi-dhl commented 3 years ago

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

hi-dhl commented 3 years ago

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

hi-dhl commented 3 years ago

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

aprz512 commented 3 years ago

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