Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stripeSdk has not been initialized on Android #68

Closed
amentone opened this issue May 24, 2021 · 13 comments · Fixed by #94
Closed

stripeSdk has not been initialized on Android #68

amentone opened this issue May 24, 2021 · 13 comments · Fixed by #94
Assignees

Comments

@amentone
Copy link

I followed the example in order to do payments with webook and I believe I have not missed anything.
When I call confirmPaymentMethod:

await Stripe.instance.confirmPaymentMethod(
    client_secret,
    PaymentMethodParams.card(),
);

I get this error:

Log error
E/MethodChannel#flutter.stripe/payments( 9694): kotlin.UninitializedPropertyAccessException: lateinit property stripeSdk has not been initialized
E/MethodChannel#flutter.stripe/payments( 9694):         at com.flutter.stripe.StripeAndroidPlugin.onMethodCall(StripeAndroidPlugin.kt:44)
E/MethodChannel#flutter.stripe/payments( 9694):         at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#flutter.stripe/payments( 9694):         at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#flutter.stripe/payments( 9694):         at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/MethodChannel#flutter.stripe/payments( 9694):         at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#flutter.stripe/payments( 9694):         at android.os.MessageQueue.next(MessageQueue.java:363)
E/MethodChannel#flutter.stripe/payments( 9694):         at android.os.Looper.loop(Looper.java:173)
E/MethodChannel#flutter.stripe/payments( 9694):         at android.app.ActivityThread.main(ActivityThread.java:8178)
E/MethodChannel#flutter.stripe/payments( 9694):         at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#flutter.stripe/payments( 9694):         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
E/MethodChannel#flutter.stripe/payments( 9694):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
E/flutter ( 9694): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: PlatformException(error, lateinit property stripeSdk has not been initialized, null, kotlin.UninitializedPropertyAccessException: lateinit property stripeSdk has not been initialized
E/flutter ( 9694):      at com.flutter.stripe.StripeAndroidPlugin.onMethodCall(StripeAndroidPlugin.kt:44)
E/flutter ( 9694):      at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter ( 9694):      at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter ( 9694):      at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/flutter ( 9694):      at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter ( 9694):      at android.os.MessageQueue.next(MessageQueue.java:363)
E/flutter ( 9694):      at android.os.Looper.loop(Looper.java:173)
E/flutter ( 9694):      at android.app.ActivityThread.main(ActivityThread.java:8178)
E/flutter ( 9694):      at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 9694):      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
E/flutter ( 9694):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
E/flutter ( 9694): )
E/flutter ( 9694): #0      JSONMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:164:7)
E/flutter ( 9694): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158:18)
E/flutter ( 9694): <asynchronous suspension>
E/flutter ( 9694): #2      MethodChannelStripe.initialise (package:stripe_platform_interface/src/method_channel_stripe.dart:36:5)
E/flutter ( 9694): <asynchronous suspension>
E/flutter ( 9694): #3      Stripe._initialise (package:flutter_stripe/src/stripe.dart:315:5)
E/flutter ( 9694): <asynchronous suspension>
E/flutter ( 9694): #4      Stripe.confirmPaymentMethod (package:flutter_stripe/src/stripe.dart:186:5)
E/flutter ( 9694): <asynchronous suspension>

The thing is that the example works, my app doesn't.
I've call also in my main.dart before runApp and public key already configured:

WidgetsFlutterBinding.ensureInitialized();
flutter doctor -v
[✓] Flutter (Channel stable, 2.2.0, on Linux, locale en_GB.UTF-8)
    • Flutter version 2.2.0 at /home/anmentone/lib/flutter
    • Framework revision b22742018b (10 days ago), 2021-05-14 19:12:57 -0700
    • Engine revision a9d88a4d18
    • Dart version 2.13.0

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /home/anmentone/Android/Sdk
    • Platform android-30, build-tools 30.0.3
    • Java binary at: /usr/local/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.8+0-b944-P17168821)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Android Studio (version 4.2)
    • Android Studio at /usr/local/android-studio
    • Flutter plugin version 56.0.2
    • Dart plugin version 202.8488
    • Java version OpenJDK Runtime Environment (build 11.0.8+0-b944-P17168821)

[✓] IntelliJ IDEA Community Edition (version 2021.1)
    • IntelliJ at /usr/local/idea-IC-211.7142.45
    • Flutter plugin version 56.0.5
    • Dart plugin version 211.7233

[✓] VS Code (version 1.56.2)
    • VS Code at /usr/share/code
    • Flutter extension version 3.22.0

[✓] Connected device (2 available)
    • POT LX1 (mobile) • 39V4C19A18025168 • android-arm64  • Android 10 (API 29)
    • Chrome (web)     • chrome           • web-javascript • Google Chrome 90.0.4430.212

• No issues found!
  • Package version: 1.0.1+2

Thanks for your help!

@amentone
Copy link
Author

When stripeSdk.initialise() is invoked, stripeSdk property has not yet initialized.

com/flutter/stripe/StripeAndroidPlugin.kt

44 when (call.method) {
45  "initialise" -> {
46    stripeSdk.initialise(
47      params = ReadableMap(call.arguments as JSONObject),
48      promise = Promise(result),
49    )
50  }

And this is strange because the initialization is made here:

com/flutter/stripe/StripeAndroidPlugin.kt

107 override fun onAttachedToActivity(binding: ActivityPluginBinding) {
108  stripeSdk = StripeSdkModule(ReactApplicationContext(binding), stripeSdkCardViewManager)
109 }

Is possibile that onAttachedToActivity is never triggered?
Unfortunately I can't set breakpoints there, I tried with logging but nothing appear on the debug console.

@jonasbark
Copy link
Member

Is your main activity based on FlutterFragmentActivity or FlutterActivity?

@amentone
Copy link
Author

Sorry for my question, maybe I am not prepared for this. I'm using your plugin in a flutter application.
FlutterActivity/FlutterFragmentAcitivity are useful to integrate Flutter within an Android app, is that my case?
I have not written any main activity.

Thank you for your support, and sorry, I am trying to learn :)

@jamesblasco
Copy link
Member

Noo need to worry! Thank you for creating this issue, you have been very helpful so far. By default, Flutter apps use FlutterActivity by default. You can find this in the file MainActivity.kt inside the android folder.

I think FlutterFragmentActivity is needed for the Stripe SDK to work, @jonasbark can you confirm this?. If this is the case we should add this to the docs.

The change should be quite easy, change FlutterActivity to FlutterFragmentAcitivity in MainActivity.kt

@amentone
Copy link
Author

amentone commented May 25, 2021

Ah ok! Thanks for this tip.
I did a quick check and yes, my MainActivity is based on FlutterActivity while the MainActivity (from the example, that works) is based on FlutterFragmentActivity but I missed totally this thing.

@amentone
Copy link
Author

Now it's working well.

Thank you guys!

@giandifra
Copy link

Hi, I have the same error, but changing my MainActivity.kt I receive errors from Firebase plugin!

Have you suggestion to solve this? There is another fix ?

Thanks

@jamesblasco
Copy link
Member

Could you specify the error you are getting with the Firebase plugin?

@giandifra
Copy link

Could you specify the error you are getting with the Firebase plugin?

It's work now, I cleaned the project!

@jamesblasco
Copy link
Member

I will close this issue now that is detailed inside the readme

@jonasbark
Copy link
Member

I'll implement a runtime check so it's easier to read configuration issues

@jonasbark jonasbark self-assigned this May 27, 2021
@amentone
Copy link
Author

Hi guys, I'm back here writing again.
I'm developing a plugin for flutter to insert card payment functionality inside my flutter app for mypos using mypos SDK (myPOS-Smart-SDK).
My app is about "digital commercial documents" (receipt) and is used by vendors instead of a physical cash register.
I only use stripe for subscription renewal, which is required to use some services in the app.
So these two plugins are always used separately but I'm having some unexpected issues.
The functioning of the app is like a simple cash register, when there is a sale there is a request for payment and the customer can decide to pay by card using the integrated card reader of mypos. The payment handling is done with the plugin I'm developing that consumes the mypos API internally.
The strange thing is that when the payment finishes and mypos close its activity, the app crashes throwing me this exception:

kotlin.UninitializedPropertyAccessException: lateinit property stripe has not been initialized
E/AndroidRuntime(25099): 	at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(25099): 	at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(25099): 	at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime(25099): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(25099): 	at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(25099): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
E/AndroidRuntime(25099): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
E/AndroidRuntime(25099): Caused by: kotlin.UninitializedPropertyAccessException: lateinit property stripe has not been initialized
E/AndroidRuntime(25099): 	at com.reactnativestripesdk.StripeSdkModule.access$getStripe$p(StripeSdkModule.kt:20)
E/AndroidRuntime(25099): 	at com.reactnativestripesdk.StripeSdkModule$mActivityEventListener$1.onActivityResult(StripeSdkModule.kt:45)
E/AndroidRuntime(25099): 	at com.facebook.react.bridge.BaseActivityEventListener.onActivityResult(BaseActivityEventListener.kt:15)
E/AndroidRuntime(25099): 	at io.flutter.embedding.engine.FlutterEngineConnectionRegistry$FlutterEngineActivityPluginBinding.onActivityResult(FlutterEngineConnectionRegistry.java:739)
E/AndroidRuntime(25099): 	at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.onActivityResult(FlutterEngineConnectionRegistry.java:426)
E/AndroidRuntime(25099): 	at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onActivityResult(FlutterActivityAndFragmentDelegate.java:677)
E/AndroidRuntime(25099): 	at io.flutter.embedding.android.FlutterFragment.onActivityResult(FlutterFragment.java:769)
E/AndroidRuntime(25099): 	at io.flutter.embedding.android.FlutterFragmentActivity.onActivityResult(FlutterFragmentActivity.java:509)
E/AndroidRuntime(25099): 	at android.app.Activity.dispatchActivityResult(Activity.java:6235)
E/AndroidRuntime(25099): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)
E/AndroidRuntime(25099): 	... 10 more
I/Process (25099): Sending signal. PID: 25099 SIG: 9

This left me surprised as I am not using Stripe in this segment.

Seeing the message error, I actually tried using stripe before I could make a payment with the mypos API, and it went like this...
After making the payment I get a black screen but the app doesn't crash and this is the error message:

Activity com.anmentone.app.MainActivity has leaked IntentReceiver
E/ActivityThread(23524): android.app.IntentReceiverLeaked: Activity com.anmentone.app.MainActivity has leaked IntentReceiver com.reactnativestripesdk.StripeSdkModule$mPaymentSheetReceiver$1@3d98bd7f that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(23524): 	at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:903)
E/ActivityThread(23524): 	at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:704)
E/ActivityThread(23524): 	at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1650)
E/ActivityThread(23524): 	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1630)
E/ActivityThread(23524): 	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1624)
E/ActivityThread(23524): 	at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:489)
E/ActivityThread(23524): 	at com.facebook.react.bridge.ReactComponentActivityWrapper.registerReceiver(ReactComponentActivityWrapper.java:39)
E/ActivityThread(23524): 	at com.reactnativestripesdk.StripeSdkModule.initialise(StripeSdkModule.kt:240)
E/ActivityThread(23524): 	at com.flutter.stripe.StripeAndroidPlugin.onMethodCall(StripeAndroidPlugin.kt:44)
E/ActivityThread(23524): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/ActivityThread(23524): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/ActivityThread(23524): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/ActivityThread(23524): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/ActivityThread(23524): 	at android.os.MessageQueue.next(MessageQueue.java:143)
E/ActivityThread(23524): 	at android.os.Looper.loop(Looper.java:122)
E/ActivityThread(23524): 	at android.app.ActivityThread.main(ActivityThread.java:5254)
E/ActivityThread(23524): 	at java.lang.reflect.Method.invoke(Native Method)
E/ActivityThread(23524): 	at java.lang.reflect.Method.invoke(Method.java:372)
E/ActivityThread(23524): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
E/ActivityThread(23524): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
Device info

myPOS Smart N5

Operating system Android 5.1
Processor 4 Core CPU + Secure CPU
Memory 8GB FLASH, 1GB RAM
Display 5.5’ (720 x 1280) Colorful LCD capacitive touchscreen with signature capture functionality
Printer High-Speed Thermal PrinterPaper Roll Width/Diameter: 58mm/40mm
Communications 4G LTE/ Wi-Fi / Bluetooth
Camera 5MP - rear -facing
Data Capture 1D Barcode scanner (optional)2MP camera -front-facing (optional)
GPS Tracking GPS / BEIDOU / GLONASS
Card Readers Magstripe: Triple track, high coercivity, bi-directionalSmart Card: EMV & PBOC approvedContactless : NFC 13.56MHz, support ISO14443, Type A/B/C, MifareCard (optional)
Card Slots PSAM: 2SIM: 1SD: 1
Battery Li-ion 4300mAhInput : 100-240V, 50-60HZOutput: 5V/2A
Multi-media Video, Audio
Dimensions L × W × H = 186mm × 82mm × 64mm , 417g
Device Ports 1 Micro-USB OTG
Environmental Operating Temperature: 0°C ̴ 50°C (32°F ̴ 122°F)  Storage Temperature: -20°C ̴ 60°C (-4°F ̴ 158°F) Relative Humidity: 5% ̴ 95% (Non-Condensing)
Optional Base Charging Base / Wi-Fi Base: Wi-Fi, integrated charging
Certifications PCI 4.X, EMV, PayPass, PayWave certified
Languages English, German, Bulgarian, Czech, Greek, Spanish, French, Croatian, Italian, Dutch, Portugal, Romanian, Swedish, Hungarian, Icelandic, Latvian, Polish, Slovenian, Norwegian

I emphasize that Stripe has nothing to do with these payments. I use it elsewhere to be able to renew the subscription which allows you to use premium features.

I'm trying to go deeper but I can't understand the problem. If you have any ideas I would be very grateful.
Thank you!

@jonasbark
Copy link
Member

This already provides plenty of information, thank you! We will have a look.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants