flutter_stripe icon indicating copy to clipboard operation
flutter_stripe copied to clipboard

Error during initialize library

Open AnnaVadimovna opened this issue 3 years ago • 8 comments

App crash during app initializing with error on few devices

Unable to start activity ComponentInfo{MainActivity}: androidx.fragment.app.L: 
Unable to instantiate fragment PaymentLauncherFragment: could not find Fragment constructor
  • Device: Galaxy S20 FE 5G, Galaxy A40, Redmi Note 8T
  • OS: android 9+
  • Package version: [2.4.0]
  • Flutter version [e.g. 2.0.0.]

Fragments need to have a no-args constructor for the Android system to re-instantiate them. https://developer.android.com/reference/android/app/Fragment#public-constructors_1

AnnaVadimovna avatar May 16 '22 10:05 AnnaVadimovna

Can you post the full stack trace of the exception? Also please provide the information about the package version and Flutter version that you use.

jonasbark avatar May 16 '22 11:05 jonasbark

Crash report from crashlytics i.o.i0 is PaymentLauncherFragment

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{MainActivity}: androidx.fragment.app.L: Unable to instantiate fragment i.o.i0: could not find Fragment constructor
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3472)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3636)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2084)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:223)
       at android.app.ActivityThread.main(ActivityThread.java:7888)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)

Caused by androidx.fragment.app.L: Unable to instantiate fragment i.o.i0: could not find Fragment constructor
       at androidx.fragment.app.Fragment.instantiate(Fragment.java:66)
       at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:0)       at androidx.fragment.app.FragmentManager$2.instantiate(FragmentManager.java:0)
       at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:0)       at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:0)
       at androidx.fragment.app.FragmentManager.J0(FragmentManager.java:123)
       at androidx.fragment.app.FragmentManager.attachController(FragmentManager.java:0)
       at androidx.fragment.app.FragmentController.attachHost(FragmentController.java:5)
       at androidx.fragment.app.FragmentActivity.lambda$init$1(FragmentActivity.java:0)       at androidx.fragment.app.FragmentActivity.lambda$init$1$FragmentActivity(FragmentActivity.java:0)       at androidx.fragment.app.-$$Lambda$FragmentActivity$QtiQ2ZI3e38UkO1_xuJ8vE_JZj4.onContextAvailable(-.java:0)
       at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:20)
       at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:7)
       at androidx.fragment.app.FragmentActivity.onCreate()
       at io.flutter.embedding.android.FlutterFragmentActivity.onCreate(FlutterFragmentActivity.java:0)
       at android.app.Activity.performCreate(Activity.java:8019)
       at android.app.Activity.performCreate(Activity.java:8003)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3445)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3636)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2084)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:223)
       at android.app.ActivityThread.main(ActivityThread.java:7888)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)

Caused by java.lang.NoSuchMethodException: i.o.i0.<init> []
       at java.lang.Class.getConstructor0(Class.java:2332)
       at java.lang.Class.getConstructor(Class.java:1728)
       at androidx.fragment.app.Fragment.instantiate(Fragment.java:15)
       at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:0)       at androidx.fragment.app.FragmentManager$2.instantiate(FragmentManager.java:0)
       at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:0)       at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:0)
       at androidx.fragment.app.FragmentManager.J0(FragmentManager.java:123)
       at androidx.fragment.app.FragmentManager.attachController(FragmentManager.java:0)
       at androidx.fragment.app.FragmentController.attachHost(FragmentController.java:5)
       at androidx.fragment.app.FragmentActivity.lambda$init$1(FragmentActivity.java:0)       at androidx.fragment.app.FragmentActivity.lambda$init$1$FragmentActivity(FragmentActivity.java:0)       at androidx.fragment.app.-$$Lambda$FragmentActivity$QtiQ2ZI3e38UkO1_xuJ8vE_JZj4.onContextAvailable(-.java:0)
       at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:20)
       at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:7)
       at androidx.fragment.app.FragmentActivity.onCreate()
       at io.flutter.embedding.android.FlutterFragmentActivity.onCreate(FlutterFragmentActivity.java:0)
       at android.app.Activity.performCreate(Activity.java:8019)
       at android.app.Activity.performCreate(Activity.java:8003)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3445)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3636)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2084)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:223)
       at android.app.ActivityThread.main(ActivityThread.java:7888)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)

Package version: 2.4.0 Flutter version 2.10.5

AnnaVadimovna avatar May 16 '22 11:05 AnnaVadimovna

I don't see anything that suggests that it's caused by Stripe - do you? Can you update to the latest Flutter + stripe version and check again?

jonasbark avatar May 16 '22 11:05 jonasbark

Now checked with the flag "Don’t Keep Activities". The bug began to be reproduced when the application was restored from the background. This behavior can also happen if the system decides to recreate our activity after launching another application.

This is why fragments are required to have an empty constructor.

AnnaVadimovna avatar May 16 '22 12:05 AnnaVadimovna

Hi!

I'm facing the same issue. I can confirm that I can reproduce this 100% on Android 12 device if I enable the Don't keep activities flag. My version of flutter_stripe is 2.5.0 but I also tried 2.4.0 and 3.0.0 with the same result.

I found this this issue that talks about the same problem on the Stripe ReactNative repo.

Here is my stackTrace that shows Stripe is indeed linked to the issue.

E/AndroidRuntime(16952): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bsit.test/com.bsit.test.MainActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.reactnativestripesdk.PaymentLauncherFragment: could not find Fragment constructor
E/AndroidRuntime(16952): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3707)
E/AndroidRuntime(16952): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)
E/AndroidRuntime(16952): 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime(16952): 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime(16952): 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime(16952): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
E/AndroidRuntime(16952): 	at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(16952): 	at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime(16952): 	at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime(16952): 	at android.app.ActivityThread.main(ActivityThread.java:7870)
E/AndroidRuntime(16952): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(16952): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime(16952): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime(16952): Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.reactnativestripesdk.PaymentLauncherFragment: could not find Fragment constructor
E/AndroidRuntime(16952): 	at androidx.fragment.app.Fragment.instantiate(Fragment.java:630)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentManager$2.instantiate(FragmentManager.java:448)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:81)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentStateManager.(FragmentStateManager.java:85)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentManager.restoreSaveStateInternal(FragmentManager.java:2410)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentManager.attachController(FragmentManager.java:2584)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentController.attachHost(FragmentController.java:116)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentActivity.lambda$init$1$androidx-fragment-app-FragmentActivity(FragmentActivity.java:128)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentActivity$$ExternalSyntheticLambda0.onContextAvailable(Unknown Source:2)
E/AndroidRuntime(16952): 	at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99)
E/AndroidRuntime(16952): 	at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:352)
E/AndroidRuntime(16952): 	at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:249)
E/AndroidRuntime(16952): 	at io.flutter.embedding.android.FlutterFragmentActivity.onCreate(FlutterFragmentActivity.java:279)
E/AndroidRuntime(16952): 	at android.app.Activity.performCreate(Activity.java:8054)
E/AndroidRuntime(16952): 	at android.app.Activity.performCreate(Activity.java:8034)
E/AndroidRuntime(16952): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
E/AndroidRuntime(16952): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688)
E/AndroidRuntime(16952): 	... 12 more
E/AndroidRuntime(16952): Caused by: java.lang.NoSuchMethodException: com.reactnativestripesdk.PaymentLauncherFragment. []
E/AndroidRuntime(16952): 	at java.lang.Class.getConstructor0(Class.java:2363)
E/AndroidRuntime(16952): 	at java.lang.Class.getConstructor(Class.java:1759)
E/AndroidRuntime(16952): 	at androidx.fragment.app.Fragment.instantiate(Fragment.java:615)
E/AndroidRuntime(16952): 	... 29 more

diegobsit avatar May 16 '22 13:05 diegobsit

Yes, relates directly to your linked issue: https://github.com/stripe/stripe-react-native/issues/930 as it is a direct dependency, will need fixing there and I believe is being looked at.

huckle-panda avatar May 16 '22 14:05 huckle-panda

Thanks for cross-linking 👍

jonasbark avatar May 16 '22 15:05 jonasbark

By the way, a quick workaround (only if you don't need that wild Fragment around) is doing this on Android:

  • Create a Method Channel to talk through the native bridge
  • Create a method, for example "removeStripeFragmentOnTop"
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler(
                    (call, result) -> {
                        if (call.method.equals("removeStripeFragmentOnTop")) {
                            // TODO - temporary, see [https://github.com/stripe/stripe-react-native/issues/930]
                            final Fragment possibleStripeFragment = getSupportFragmentManager().findFragmentByTag("payment_launcher_fragment");
                            if (possibleStripeFragment != null) {
                                getSupportFragmentManager().beginTransaction().remove(possibleStripeFragment).commitAllowingStateLoss();
                            }
                            result.success(true);
                        } else {
                            result.notImplemented();
                        }
                    }
            );

Then call it from Flutter (right after initialising Stripe, after its Future)

RafaRuiz avatar May 17 '22 09:05 RafaRuiz

This is fixed and should not happen anymore (tried to reproduce it). If the issue still happens create a new ticket or reopen this one and we will contact stripe

remonh87 avatar Sep 12 '22 20:09 remonh87