如何在 DefaultLifecycleObserver 中使用 DestoryView()?

问题描述 投票:0回答:1

目前,我正在使用这个:

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。我怎样才能做到这一点?

android android-fragments android-viewbinding
1个回答
0
投票
  • 如果您使用
    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.")
            }
        }
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.