Android Studio Error on Data Binding after upgrading to Studio 4.2 Canary 5

Viewed 511

I am using data binding to inflate the view of a fragment. It was working fine before I upgraded Android Studio to version 4.2 Canary 5. It also asked me to upgrade the gradle version to 4.2.0-alpha05 which upgraded the default language feature to Java 8. But now the data binding section is throwing a NullPointerException. I want some help here. Below is the trace of the error.

2020-07-22 01:11:13.437 18307-18307/com.deamat.mydeamat.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.deamat.mydeamat.debug, PID: 18307
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.deamat.mydeamat.debug/com.deamat.mydeamat.MainActivity}: java.lang.IllegalStateException: FragmentSignupBinding.in…          false
            ) must not be null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
        at android.app.ActivityThread.-wrap14(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
     Caused by: java.lang.IllegalStateException: FragmentSignupBinding.in…          false
            ) must not be null
        at com.deamat.auth.SignupFragment.onCreateView(SignupFragment.kt:27)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2629)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1256)
        at android.app.Activity.performStart(Activity.java:6959)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2890)
            ... 9 more

Here is the data binding call

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
       val binding = FragmentSignupBinding.inflate(
            inflater,
            container,
            false
        )

        ...
}

Note: I am using multiple modules in my app and I have enabled data binding inside each module. However the login_fragment layout is within the same module as the Fragment class.

2 Answers

Databinding is broken for us too since updating to AS 4.2 Canary 5 / Gradle 4.2.0-alpha05. We can't even build our app.

In our case it seems to be related to custom BindingAdapter's. Removing their usage from layout files, the app can be build - though missing the corresponding logic. Not a solution really, so we had to downgrade to Canary 4 for now.

Do it like this:

class PracticeFragment:Fragment() {
    private lateinit var binding: FragmentPracticeBinding//declare your binding 

    companion object {
        fun newInstance() = PracticeFragment()
    }
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentPracticeBinding.inflate(inflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    }
}
Related