dapriett / nativescript-google-maps-sdk

Cross Platform Google Maps SDK for Nativescript
MIT License
244 stars 169 forks source link

Application crash on location.back() action after opening external application like camera or gallery #363

Open d-mh opened 4 years ago

d-mh commented 4 years ago

I have a problem with application written with NativeScript and Angular on Android (this is only Android app). This app is using dapriett/nativescript-google-maps-sdk, NativeScript/nativescript-camera and nativescript-imagepicker

Repo url: https://github.com/d-mh/nativescript-google-maps-crash

Application crash every time when I do below steps:

  1. Load Google Maps on on main page (map.component.ts)
  2. Navigate to second component (event.component.ts) - fab button on right bottom side of page
  3. On event.component.ts I am opening image picker (nativescript-imagepicker)
  4. Then cancel action (camera or image picker) or pick image
  5. press back button on Android or location.back()
  6. Crash (log below)

What is interesting when I do location.back() or press back button on Android without opening camera or image picker, back action works great and without any errors.

I am thinking this issue is related to error below:

System.err: Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class com.google.android.material.stateful.ExtendableSavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x2. Make sure other views do not use the same id.

but I am not sure how to change id on View with Angular app ...

Thank you for any inputs!

I am receiving this error:

JS: Angular is running in the development mode. Call enableProdMode() to enable the production mode.
JS: Map Ready
JS: Setting a marker...
JS: Map Ready
JS: Setting a marker...
JS: Camera changed: {"latitude":-33.85999989127037,"longitude":151.1999999731779,"zoom":8,"bearing":0,"tilt":0} false
JS: Selection done: [{"_observers":{},"_options":{"keepAspectRatio":true,"autoScaleFactor":true},"_android":"/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20190902-WA0000.jpg"}]
JS: Selection done: [{"_observers":{},"_options":{"keepAspectRatio":true,"autoScaleFactor":true},"_android":"/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20190902-WA0000.jpg"}]
System.err: An uncaught Exception occurred on "main" thread.
System.err: Calling js method onCreateView failed
System.err: Error: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class com.google.android.material.stateful.ExtendableSavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x4. Make sure other views do not use the same id.
System.err:     android.view.View.onRestoreInstanceState(View.java:18663)
System.err:     android.view.View.dispatchRestoreInstanceState(View.java:18635)
System.err:     android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3823)
System.err:     android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3829)
System.err:     android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3829)
System.err:     android.view.View.restoreHierarchyState(View.java:18613)
System.err:     com.tns.Runtime.callJSMethodNative(Native Method)
System.err:     com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1242)
System.err:     com.tns.Runtime.callJSMethodImpl(Runtime.java:1122)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:1109)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:1089)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:1081)
System.err:     com.tns.FragmentClass.onCreateView(FragmentClass.java:53)
System.err:     androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
System.err:     androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
System.err:     androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
System.err:     androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
System.err:     androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
System.err:     androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
System.err:     androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
System.err:     androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
System.err:     androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
System.err:     androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
System.err:     android.os.Handler.handleCallback(Handler.java:873)
System.err:     android.os.Handler.dispatchMessage(Handler.java:99)
System.err:     android.os.Looper.loop(Looper.java:201)
System.err:     android.app.ActivityThread.main(ActivityThread.java:6810)
System.err:     java.lang.reflect.Method.invoke(Native Method)
System.err:     com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
System.err:     com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
System.err:
System.err: StackTrace:
System.err:     Frame: function:'push.../node_modules/tns-core-modules/ui/frame/frame.js.FragmentCallbacksImplementation.onCreateView', file:'file:///node_modules/tns-core-modules/ui/frame/frame.js:691:0
System.err:     Frame: function:'push.../node_modules/tns-core-modules/ui/frame/fragment.js.FragmentClass.onCreateView', file:'file:///node_modules/tns-core-modules/ui/frame/fragment.js:26:0
System.err:     at com.tns.Runtime.callJSMethodNative(Native Method)
System.err:     at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1242)
System.err:     at com.tns.Runtime.callJSMethodImpl(Runtime.java:1122)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:1109)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:1089)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:1081)
System.err:     at com.tns.FragmentClass.onCreateView(FragmentClass.java:53)
System.err:     at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
System.err:     at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
System.err:     at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
System.err:     at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
System.err:     at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
System.err:     at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
System.err:     at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
System.err:     at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
System.err:     at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
System.err:     at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
System.err:     at android.os.Handler.handleCallback(Handler.java:873)
System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
System.err:     at android.os.Looper.loop(Looper.java:201)
System.err:     at android.app.ActivityThread.main(ActivityThread.java:6810)
System.err:     at java.lang.reflect.Method.invoke(Native Method)
System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
System.err: Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class com.google.android.material.stateful.ExtendableSavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x4. Make sure other views do not use the same id.
System.err:     at android.view.View.onRestoreInstanceState(View.java:18663)
System.err:     at android.view.View.dispatchRestoreInstanceState(View.java:18635)
System.err:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3823)
System.err:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3829)
System.err:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3829)
System.err:     at android.view.View.restoreHierarchyState(View.java:18613)
System.err:     ... 24 more
trevortos commented 4 years ago

You can setup a "application.resumeEvent" and "application.suspendEvent" listener, and for Android only, call "mapView.nativeView.onResume()" and "mapView.nativeView.onPause()" I put a bit of a delay on them, and it seems to help.