Repeatedly, I made few mistakes while using the new registerForActivityResult
API, resulting in error:
Fatal Exception: java.lang.IllegalStateException: Fragment MyFragment{e964a6} (573498bb-7d87-4d58-9e84-59223f13f14c) id=0x7f0a00b3} is attempting to registerForActivityResult after being created. Fragments must call registerForActivityResult() before they are created (i.e. initialization, onAttach(), or onCreate()).
at androidx.fragment.app.Fragment.prepareCallInternal(Fragment.java:3)
at com.package.name.android.ui.MyFragment.registerForActivityResult(MyFragment.java:15)
Developers should be provided with compile-time lint error or/and Code Inspections for such specific misuse of lifecycle-sensitive function calls.
I wrote myself one to remind me that I'm ending up in usability issue. This lint check searches for usage of registerForActivityResult
outside onCreate
or onAttach
lifecycle functions in Fragment
or Activity
subclasses.
It considers unary expressions, such as:
registerForActivityResult(contract, callback).launch(argument)
and binary expressions:
launcher = registerForActivity(contract, callback)
which object will be used to call launch(arguments) .
This lint won't show warning, if function call is made in another function, unfortunately deeper function stack is not considered, also calls inside lambdas remains unchecked.
Top comments (0)