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

App crash on dialog #23

Closed kralonur closed 3 years ago

kralonur commented 3 years ago

I'm using this library with this fragment: https://github.com/kralonur/NotForgot/blob/37ea1a5627fea1d35ac99298786f7ab81f0430e5/app/src/main/java/com/example/notforgot/ui/task_create/category/CategoryDialog.kt

But I'm having crash with this code: (which is exactly code I'm using except using dialogViewBinding)

class CategoryDialog : DialogFragment() {
    private val viewModel by viewModels<CategoryViewModel>()
    private val binding by dialogViewBinding(LayoutCreateCategoryBinding::bind, R.id.category)
    private lateinit var dialog: AlertDialog

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        binding.lifecycleOwner = requireParentFragment().viewLifecycleOwner //Crash here
        binding.viewModel = viewModel // Even here if I dont set lifecycle owner

So basically I'm having crash whereever I use binding.

Logcat:

java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
        at androidx.fragment.app.Fragment.getViewLifecycleOwner(Fragment.java:328)
        at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindings.kt:14)
        at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindings.kt:10)
        at by.kirich1409.viewbindingdelegate.ViewBindingProperty.getValue(ViewBindingProperty.kt:30)
        at com.example.notforgot.ui.task_create.category.CategoryDialog.getBinding(Unknown Source:7)
        at com.example.notforgot.ui.task_create.category.CategoryDialog.onCreateDialog(CategoryDialog.kt:24)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:419)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1485)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1199)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
        at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2181)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2004)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1959)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1861)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:914)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7560)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2020-10-24 01:41:09.200 14061-14061/com.example.notforgot I/Process: Sending signal. PID: 14061 SIG: 9
merlin-zaraza commented 3 years ago

The same for me. Please suggest workaround

Fatal Exception: java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
       at androidx.fragment.app.Fragment.getViewLifecycleOwner(Fragment.java)
       at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindingProperty.java)
       at by.kirich1409.viewbindingdelegate.FragmentViewBindingProperty.getLifecycleOwner(FragmentViewBindingProperty.java)
       at by.kirich1409.viewbindingdelegate.ViewBindingProperty.getValue(ViewBindingProperty.java)
       at ua.hope.vkonteksti.lessonview.LessonFragment.getBinding(LessonFragment.java)
       at ua.hope.vkonteksti.lessonview.LessonFragment.onLoadFinish(LessonFragment.java)
       at ua.hope.vkonteksti.core.view.BaseWebView$2.onPageFinished(BaseWebView.java)
       at Ci.b(Ci.java:2)
       at kC.handleMessage(kC.java:65)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5421)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
kirich1409 commented 3 years ago

The dialogViewBinding() delegate works after DialogFragment.onCreateDialog() call. Before oк inside that callback you will get crash. But I've found issue in the dialogViewBinding() and it will bi fixed in 1.3.1