diff --git a/app/build.gradle b/app/build.gradle index da2ecf0..d7058e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ dependencies { ext.material = "1.2.1" ext.appcompat = "1.2.0" ext.ktx = "1.3.2" - ext.remote = true + ext.remote = false implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "androidx.core:core-ktx:${ktx}" diff --git a/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt b/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt index b19a764..023267d 100644 --- a/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt +++ b/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt @@ -1,9 +1,9 @@ package com.hi.dhl.binding.base import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager import androidx.viewbinding.ViewBinding import com.hi.dhl.binding.observerWhenCreated -import com.hi.dhl.binding.observerWhenDestroyed import kotlin.properties.ReadOnlyProperty /** @@ -21,18 +21,21 @@ abstract class FragmentDelegate( init { - /** - * 感谢 architecture-components-samples 提供的思路 - * - * 最原始的处理的方案 监听 Fragment 的生命周期,会存在 Fragment 和 Fragment 中的 View 生命周期不一致问题 - * 详情查看 [issue][https://github.com/hi-dhl/Binding/issues/15] - */ + // 详情查看 [issue][https://github.com/hi-dhl/Binding/issues/31#issuecomment-1109729949] fragment.lifecycle.observerWhenCreated { - fragment.viewLifecycleOwnerLiveData.observe(fragment) { viewOwner -> - viewOwner.lifecycle.observerWhenDestroyed { - destroyed() + val fragmentManager = fragment.requireFragmentManager() + fragmentManager.registerFragmentLifecycleCallbacks(object : + FragmentManager.FragmentLifecycleCallbacks() { + override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) { + super.onFragmentViewDestroyed(fm, f) + // 检查 fragment 的目的,为了防止类似于加载多个 Fragment 场景销毁的时候,出现不必要的异常 + if (f == fragment) { + destroyed() + fragmentManager.unregisterFragmentLifecycleCallbacks(this) + } + } - } + }, false) } } diff --git a/binding/src/main/java/com/hi/dhl/binding/viewbind/FragmentViewBinding.kt b/binding/src/main/java/com/hi/dhl/binding/viewbind/FragmentViewBinding.kt index dda88ab..b567393 100644 --- a/binding/src/main/java/com/hi/dhl/binding/viewbind/FragmentViewBinding.kt +++ b/binding/src/main/java/com/hi/dhl/binding/viewbind/FragmentViewBinding.kt @@ -1,10 +1,12 @@ package com.hi.dhl.binding.viewbind import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.viewbinding.ViewBinding import com.hi.dhl.binding.base.FragmentDelegate import com.hi.dhl.binding.bindMethod import com.hi.dhl.binding.inflateMethod +import java.lang.Exception import kotlin.reflect.KProperty /** @@ -28,6 +30,21 @@ class FragmentViewBinding( } ?: let { + try { + /** + * 检查目的,是为了防止在 onCreateView() or after onDestroyView() 使用 binding。 + * 另外在销毁之后,如果再次使用,由于 delegate property 会被再次初始化 + * + * 捕获这个异常的原因,是为了兼容之前的版本,防止因为升级,造成崩溃,如果不正确使用,将会输出一些日志作为警告 + */ + check(thisRef.viewLifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + "cannot use binding in before onCreateView() or after onDestroyView() from 1.1.3. about [issue](https://github.com/hi-dhl/Binding/issues/31#issuecomment-1109733307)" + } + } catch (e: Exception) { + e.printStackTrace() + } + + val bind: T if (thisRef.view == null) { // 这里为了兼容在 navigation 中使用 Fragment