Ильин Павел
Ильин Павел

Reputation: 816

Jetpack Compose. Offset is unspecified on Redmi devices

In my project I get a lot of those exceptions:

Fatal Exception: java.lang.IllegalStateException
Offset is unspecified

These exceptions only appear on Redmi devices (tablets and handheld). This issue is present from version 1.1.0 to the latest 1.2.0-beta03 of Jetpack Compose, so changing version is not an option.

There is a full stacktrace:

androidx.compose.ui.geometry.Offset.getX-impl (Offset.java:28)
androidx.compose.ui.platform.AndroidComposeView.recalculateWindowPosition (AndroidComposeView.java:2)
androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc (AndroidComposeView.java:6)
androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent (AndroidComposeView.java:62)
android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3088)
android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2781)
android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3088)
android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2781)
android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3088)
android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2781)
android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3088)
android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2781)
com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:496)
com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1853)
android.app.Activity.dispatchTouchEvent (Activity.java:4072)
com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:454)
android.view.View.dispatchPointerEvent (View.java:13744)
android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:5601)
android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:5401)
android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4902)
android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4955)
android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:4921)
android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:5061)
android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:4929)
android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:5118)
android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4902)
android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4955)
android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:4921)
android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:4929)
android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4902)
android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:7654)
android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:7623)
android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:7584)
android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:7785)
android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:251)
android.view.InputEventReceiver.nativeConsumeBatchedInputEvents (InputEventReceiver.java)
android.view.InputEventReceiver.consumeBatchedInputEvents (InputEventReceiver.java:213)
android.view.ViewRootImpl.doConsumeBatchedInput (ViewRootImpl.java:7730)
android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run (ViewRootImpl.java:7809)
android.view.Choreographer$CallbackRecord.run (Choreographer.java:1031)
android.view.Choreographer.doCallbacks (Choreographer.java:854)
android.view.Choreographer.doFrame (Choreographer.java:782)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1016)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
android.os.Looper.loop (Looper.java:223)
android.app.ActivityThread.main (ActivityThread.java:7562)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:539)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:950)

Anybody faced it?

Upvotes: 4

Views: 3180

Answers (4)

harissabil
harissabil

Reputation: 41

I faced the same problem when using TextField and moving to a different screen with animation. To solve this, you have to clear the focus of the TextField before doing some animation or transition, like this:

val focusManager = LocalFocusManager.current

LaunchedEffect(key1 = someState) {
    if (someState) {
        focusManager.clearFocus()
    }
}

Upvotes: 0

1337n00b
1337n00b

Reputation: 1

I got this issue without ever directly using the offset, but when using the ".rotate()" modifier, the problem was division by zero in the the .rotate() so it was trying to rotate by NaN.

Upvotes: 0

Thracian
Thracian

Reputation: 67443

I got this issue when i change touch area of a Composable dynamically when changing scale via Modifier.graphicsLayer{} and i also use Offset.Unspecified to not draw on Canvas initially for drawing apps.

If the issue is something happens on small region and negligible use

if(offset != Offset.Unspecified) {
    xCoor = offset.x
    yCoor = offset.y
   // or do drawing with offset here for valid values

If it's a behavior that never returns any value but Offset.Unspecified you should open an issue for it.

Upvotes: 2

talhatek
talhatek

Reputation: 355

I used to get this exception when my offset parameters are not a number.
Make sure that your Offset parameters are number.

Here is how you can check if it is a number :

if(offsetX.isNaN().not()){
//handle your code here
}

Upvotes: 1

Related Questions