We’ve completed refactoring Modifier.pointerInput{ … } to make use of the brand new Modifier.Node implementation (as of model compose-ui 1.5.0-alpha02), which is a component of a bigger venture to cut back reminiscence and enhance efficiency in Compose.
A majority of it’s best to see enhancements with no adjustments to your codebase (aside from bumping up the library model).
Nevertheless, in case you are writing your personal customized gesture detectors or utilizing pointerInput(), you might be impacted by the change. Let me clarify.
The earlier iteration (Model 1.5.0-alpha01 and all the things earlier than) of pointerInput() labored by executing the entire block of code as much as awaitPointerEvent() (within the AwaitPointerEventScope block).
Right here’s an instance:
Every thing earlier than awaitPointerEvent() executes instantly (see feedback).
As soon as the code will get to awaitPointerEvent(), it can droop till an occasion is available in.
Within the new implementation (compose-ui 1.5.0-alpha02), pointerInput() lazily executes.
Meaning nothing will occur till the primary pointer occasion is fired — for instance, when a consumer presses down on the display screen.
Why would we make such a big change? Efficiency! 🙂
Just like LazyColumn, we don’t need to execute work till it’s wanted.
The earlier implementation executed every pointer enter block of code as much as the awaitPointerEvent() no matter whether or not a consumer ever interacted with the composable or not.
The Compose gesture detectors, for instance, tapping/urgent, dragging, and multi-touch, are literally constructed on prime of pointerInput() as properly, which signifies that anytime anybody makes use of a gesture detector, a superb chunk of code is executed. Nicely, in lots of circumstances, that code would possibly by no means be wanted, as an example, if the consumer by no means interacts along with your composable.
The brand new implementation avoids that. We by no means execute any of the code till it’s wanted as a result of a consumer is interacting along with your composable.
Let’s revisit the instance above to see the way it has modified within the new implementation:
Now, your complete block (see feedback) is not going to execute till the primary occasion is available in, and, if there isn’t any pointer occasion, it can by no means execute.
As soon as an occasion is triggered, the block will likely be executed (together with the primary awaitPointerEvent() name). The code will droop as soon as once more on any following awaitPointerEvent() calls till the subsequent occasion is triggered.
When you have a customized gesture handler (or any code utilizing pointerInput()) the place you depend on code in that block executing instantly (earlier than an occasion or even when there isn’t an occasion), it would be best to alter your code to take this new change under consideration.
That is most likely a fairly uncommon incidence for many of you, however it’s one thing to bear in mind as you get the enhancements.
Glad coding!
-Jeremy