flutter_stripe
flutter_stripe copied to clipboard
Error during initialize library
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
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.
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
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?
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.
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
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.
Thanks for cross-linking 👍
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)
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