androidbroadcast / ViewBindingPropertyDelegate

Make work with Android View Binding simpler
https://proandroiddev.com/make-android-view-binding-great-with-kotlin-b71dd9c87719
Apache License 2.0
1.42k stars 102 forks source link

Crash after upgrading to 1.4.2 #44

Closed guilherme-pereira-ifood closed 3 years ago

guilherme-pereira-ifood commented 3 years ago

We use noreflection variant of the library and after upgrading to 1.4.2, the app is now crashing.

This is an example of how we've been using it:

class OnboardingContainerFragment : BaseFragment() {
    private val binding by viewBinding {
        OnboardingContainerFragmentBinding.inflate(layoutInflater)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View = binding.root

And this is the crash we're receiving since 1.4.2:

    java.lang.IllegalStateException: Fragment doesn't have view associated with it or the view has been destroyed
        at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindings.kt:31)
        at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindings.kt:26)
        at by.kirich1409.viewbindingdelegate.LifecycleViewBindingProperty.getValue(ViewBindingProperty.kt:57)
        at by.kirich1409.viewbindingdelegate.LifecycleViewBindingProperty.getValue(ViewBindingProperty.kt:45)
        at br.com.ifood.activity.OnboardingContainerFragment.getBinding(Unknown Source:7)
        at br.com.ifood.activity.OnboardingContainerFragment.onCreateView(OnboardingContainerFragment.kt:34)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2950)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:515)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2088)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3122)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3056)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:473)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1514)
        at android.app.Activity.performStart(Activity.java:7843)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3412)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

I'd like your help to understand if we're doing something wrong or if there's a bug on the library.

Thanks!

guilherme-pereira-ifood commented 3 years ago

I tried to upgrade Fragment to 1.3.0 and Lifecycle to 2.3.0 on our side, but the crash is still happening.

I've also tried to use the library like in the samples (noreflection):

private val binding by viewBinding(OnboardingContainerFragmentBinding::bind)

But it didn't work too (same crash).

guilherme-pereira-ifood commented 3 years ago

Another useful information: we're using the library with Databinding, not ViewBinding.

kirich1409 commented 3 years ago

The reason is that you access to binding before ViewLifecycleOwner is created. The latest version of the library prevent such kind behaviour. Based on your sample I see this isn't perfect solution. Temporary fix for you is

class OnboardingContainerFragment : BaseFragment() {
    private val binding by viewBinding(OnboardingContainerFragmentBinding::bind)

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View = inflater.inflate(R.layout.onboarding_container_fragment, container, false)
kirich1409 commented 3 years ago

Fix has been added to develop and in few hours version 1.4.4 will be available