From 49d4cdc5e0ef0839504583bbc6e585a2f61f4498 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <darken@darken.eu> Date: Fri, 18 Sep 2020 21:46:37 +0200 Subject: [PATCH] We need to hook into `viewLifecycleOwner` not `lifeCycleOwner` otherwise the DataBinding is not correctly recreated whe fragments are reattached. (#1182) Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com> --- .../util/ui/ViewBindingExtensions.kt | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt index 045951181..9af1ba946 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt @@ -13,22 +13,27 @@ import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty inline fun <FragmentT : Fragment, reified BindingT : ViewBinding> FragmentT.viewBindingLazy() = - viewBindingLazy { - val bindingMethod = BindingT::class.java.getMethod("bind", View::class.java) - val binding = bindingMethod(null, requireView()) as BindingT - if (binding is ViewDataBinding) { - binding.lifecycleOwner = this - } - binding - } + this.viewBindingLazy( + bindingProvider = { + val bindingMethod = BindingT::class.java.getMethod("bind", View::class.java) + val binding = bindingMethod(null, requireView()) as BindingT + if (binding is ViewDataBinding) { + binding.lifecycleOwner = this.viewLifecycleOwner + } + binding + }, + lifecycleOwnerProvider = { viewLifecycleOwner } + ) @Suppress("unused") fun <FragmentT : Fragment, BindingT : ViewBinding> FragmentT.viewBindingLazy( - bindingProvider: FragmentT.() -> BindingT -) = ViewBindingProperty(bindingProvider) + bindingProvider: FragmentT.() -> BindingT, + lifecycleOwnerProvider: FragmentT.() -> LifecycleOwner +) = ViewBindingProperty(bindingProvider, lifecycleOwnerProvider) class ViewBindingProperty<ComponentT : LifecycleOwner, BindingT : ViewBinding>( - private val bindingProvider: (ComponentT) -> BindingT + private val bindingProvider: (ComponentT) -> BindingT, + private val lifecycleOwnerProvider: ComponentT.() -> LifecycleOwner ) : ReadOnlyProperty<ComponentT, BindingT> { private val uiHandler = Handler(Looper.getMainLooper()) @@ -55,7 +60,8 @@ class ViewBindingProperty<ComponentT : LifecycleOwner, BindingT : ViewBinding>( } localRef = thisRef - thisRef.lifecycle.addObserver(onDestroyObserver) + + lifecycleOwnerProvider(thisRef).lifecycle.addObserver(onDestroyObserver) return bindingProvider(thisRef).also { viewBinding = it } } -- GitLab