stripe-react-native icon indicating copy to clipboard operation
stripe-react-native copied to clipboard

GooglePayLauncherFragment does not restore local variables when system looses fragment state and restores it

Open jamesblasco opened this issue 2 years ago • 7 comments

Describe the bug https://github.com/flutter-stripe/flutter_stripe/issues/1282

One developer is reporting the app breaking on Android with this error

lateteinit property configuration has not been initialized
       at com.reactnativestripesdk.GooglePayLauncherFragment.onViewCreated(GooglePayLauncherFragment.java:29)

It looks like if the app looses state at any point the FragmentManager takes care of restoring the Fragments automatically, but expects the developer to restore the local content of the Fragment, inside the views and variables: https://developer.android.com/guide/fragments/saving-state

In our case GooglePayLauncherFragment stored several variables with lateinit that are setted up when calling presentGooglePaySheet. After that the Fragment is never removed from the activity and it. So when the app looses the state the FragmentManager automatically restores the Fragment, calls onViewCreated, and tries to use the variables that have been lost along the way

Smartphone / tablet

Device: Lots of Android phones (Samsung, Google, Oppo, Motorola, etc) OS: All the way from Android 13 to Android 10

Additional context

Stacktrace:

Fatal Exception: R9.B: lateinit property configuration has not been initialized
       at com.reactnativestripesdk.GooglePayLauncherFragment.onViewCreated(GooglePayLauncherFragment.java:29)
       at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:4)
       at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:6)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:3)
       at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:30)
       at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:27)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:9)
       at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:11)
       at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:4)
       at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:20)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1510)
       at android.app.Activity.performStart(Activity.java:8616)
       at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4204)
       at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
       at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
       at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8757)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

Desktop (please complete the following information):

  • OS: Android

jamesblasco avatar Jun 17 '23 10:06 jamesblasco

I has same issue image

HatsuneMikuV avatar Aug 16 '23 02:08 HatsuneMikuV

@charliecruzan-stripe - is there an ETA for when this issue will be investigated?

leewrigg avatar Mar 05 '24 11:03 leewrigg

Same issue here

gabvrodrigues avatar Apr 01 '24 19:04 gabvrodrigues

@charliecruzan-stripe Any news on this?

We also face this issue. The issue is connected to state restoration and it can be reproduced for debugging by enabling the 'Don't keep activities' developer option. With that enabled, it happens constantly.

Stacktrace:

kotlin.UninitializedPropertyAccessException: lateinit property configuration has not been initialized
	at com.reactnativestripesdk.GooglePayLauncherFragment.onViewCreated(GooglePayLauncherFragment.kt:41)
	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147)
	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455)
	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034)
	at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2952)
	at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
	at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350)
	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433)
	at android.app.Activity.performStart(Activity.java:7923)
	at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3332)
	at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
	at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
	at android.os.Handler.dispatchMessage(Handler.java:107)
	at android.os.Looper.loop(Looper.java:224)
	at android.app.ActivityThread.main(ActivityThread.java:7562)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

kissbudai avatar May 31 '24 10:05 kissbudai