Android Fragments 如何在DefaultLifecycleObserver中使用DestoryView()?

x6yk4ghg  于 2023-05-18  发布在  Android
关注(0)|答案(1)|浏览(140)

目前,我正在使用这个:

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
初始化部分应为:

override fun onDestroyView(owner: LifecycleOwner) {
    super.onDestroyView(owner)
    _value = null
}

但在我的课堂上,它只是做:

override fun onDestroy(owner: LifecycleOwner) {
    _value = null
}

但是onDestroyView在DefaultLifecycleObserver中不存在。我如何才能做到这一点?

3xiyfsfu

3xiyfsfu1#

  • 如果使用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.")
            }
        }
    )
}

相关问题