Skip to content

feat: add PaymentMethodMessaging widget (via PaymentMethodMessagingElement)#2403

Open
realmeylisdev wants to merge 5 commits into
flutter-stripe:mainfrom
realmeylisdev:feat/payment-method-messaging-element
Open

feat: add PaymentMethodMessaging widget (via PaymentMethodMessagingElement)#2403
realmeylisdev wants to merge 5 commits into
flutter-stripe:mainfrom
realmeylisdev:feat/payment-method-messaging-element

Conversation

@realmeylisdev
Copy link
Copy Markdown
Contributor

@realmeylisdev realmeylisdev commented Apr 23, 2026

Summary

Add a PaymentMethodMessaging Flutter widget that wraps Stripe's PaymentMethodMessagingElement (Klarna / Afterpay / Affirm promotional messaging) on both iOS and Android. Supersedes #2387 — see the closing comment there for the full post-mortem on why that branch was abandoned.

Why the rewrite

The prior PR #2387 referenced SDK classes that don't exist: iOS StripePaymentSheet.PaymentMethodMessagingView and Android com.stripe.android.paymentsheet.paymentmethodmessaging.PaymentMethodMessagingView. Neither is published by Stripe at any version. The correct class on both platforms is PaymentMethodMessagingElement, gated behind a preview annotation — the same API that stripe-react-native v0.61 wraps.

This PR starts clean from main (which already carries the 25.9.0 stripe-ios-spm bump) and implements both platforms against the real API.

What changed

  • Dart model (stripe_platform_interface): Freezed PaymentMethodMessagingConfiguration with paymentMethods, currency, amount, optional countryCode, optional locale. Enum covers Klarna, Afterpay/Clearpay, and Affirm (matches the Element's supported methods).
  • Dart widget (stripe): PaymentMethodMessaging widget with auto-resizing height, didUpdateWidget forwarding config changes to native via a per-viewId MethodChannel, dispose clearing the handler, explicit iOS / Android / UnsupportedError branching.
  • iOS (stripe_ios): PaymentMethodMessagingElementView UIView subclass (under Stripe Sdk/, matching CardFieldView/AuBECSDebitFormView) owns the PaymentMethodMessagingElement, embeds element.view with Auto Layout, guards publishable-key presence, emits height via systemLayoutSizeFitting in layoutSubviews. PaymentMethodMessagingElementFactory is the thin FlutterPlatformView adapter handling updateConfiguration and onHeightChange over the per-viewId channel (with NSNumber.intValue for the Flutter codec). Registered under flutter.stripe/payment_method_messaging in StripePlugin.
  • Android (stripe_android): adds the separate com.stripe:payment-method-messaging:$stripe_version artifact. Platform view hosts an AndroidX ComposeView inside a FrameLayout; applyConfiguration launches a coroutine that calls PaymentMethodMessagingElement.create(application).configure(config) and swaps composition state on the result (Succeeded → render element.Content(appearance); NoContent/Failed → empty composition + collapsed height). Height reported in dp via Modifier.onSizeChanged. dispose() cancels the scope, disposes the composition, clears the method-channel handler.
  • Also fixes Package.resolved to match the 25.9.0 pin in Package.swift — main was committed with a stale resolve.

Scope notes

Intentionally deferred to follow-ups (keeps review surface small):

  • Appearance config. iOS UIFont/UIColor and Android Theme/Font/Colors don't map cleanly to a shared Dart model; worth a dedicated design pass. Default Stripe appearance works for a first release.
  • Configure-result callback. RN surfaces loading / loaded / no_content / failed(error) to JS. Here we surface no-content/failed only via collapse-to-zero height. A dedicated onConfigureResult callback can land later.

Closes

Test plan

  • dart analyze clean across packages/stripe and packages/stripe_platform_interface.
  • dart run build_runner build --delete-conflicting-outputs regenerates Freezed/JSON cleanly.
  • Manual: render the widget in the example app on iOS simulator with a valid publishable key — messaging displays, height auto-adjusts.
  • Manual: render on Android emulator — Compose-hosted element displays, height auto-adjusts.
  • Manual: toggle amount in the configuration while mounted — the didUpdateWidgetupdateConfiguration path reconfigures the native element.
  • Manual: on unsupported platforms (web/desktop) the widget throws UnsupportedError at build rather than failing inside Android-specific APIs.

Summary by CodeRabbit

  • New Features
    • Added PaymentMethodMessaging widget to display Klarna/Afterpay/Affirm promotional messaging
    • Widget auto-resizes based on native content and emits height-change events
    • Full configuration: payment methods, currency, amount, country code, and locale
    • Enabled end-to-end platform support on iOS and Android and exported via the package API

Freezed model for Stripe's PaymentMethodMessagingElement (Klarna,
Afterpay/Clearpay, Affirm). Includes optional locale to match the
Element API surface on both iOS and Android.
Platform-view widget that renders Stripe's promotional messaging
element for Klarna/Afterpay/Affirm. Ships on iOS and Android via
the PaymentMethodMessagingElement preview API; throws
UnsupportedError elsewhere. Native side reports height changes via
a per-viewId MethodChannel; didUpdateWidget forwards configuration
changes through updateConfiguration; dispose unregisters the handler.
- PaymentMethodMessagingElementView (under Stripe Sdk/) is a plain
  UIView that owns a Stripe SDK PaymentMethodMessagingElement, kicks
  off create(configuration:) on an @mainactor Task, embeds
  element.view with Auto Layout on success, and reports height
  changes via a callback. Guards against a missing publishable key
  and collapses to zero height on noContent / failed results.
- PaymentMethodMessagingElementFactory is a thin FlutterPlatformView
  adapter — per-viewId FlutterMethodChannel for updateConfiguration /
  onHeightChange, NSNumber-based amount decode for the Flutter codec.
- Register the factory in StripePlugin with viewId
  flutter.stripe/payment_method_messaging.
- Update Package.resolved to the 25.9.0 SPM revision that matches
  Package.swift's exact pin (main was committed with a stale resolve).

Uses the `@_spi(PaymentMethodMessagingElementPreview) @_spi(STP)
import StripePaymentSheet` import that the element is gated behind.
…m view

- Add the separate com.stripe:payment-method-messaging artifact
  dependency, pinned to the same stripe_version as stripe-android.
- StripePaymentMethodMessagingPlatformViewFactory mirrors the
  existing Aubecs/CardField factories, including the
  Map<String?, Any?>? creationParams type used across the repo.
- StripePaymentMethodMessagingPlatformView hosts an AndroidX
  ComposeView inside a FrameLayout, calls
  PaymentMethodMessagingElement.create(application) + configure(config)
  from a scope-tied coroutine, swaps composition state on result
  (Succeeded → render element.Content(appearance); NoContent/Failed
  → empty composition + collapsed height). Height changes are
  reported in dp via Modifier.onSizeChanged. dispose() cancels the
  scope, disposes composition, and clears the method-channel handler.
- Register the factory in StripeAndroidPlugin with viewId
  flutter.stripe/payment_method_messaging.

Uses Stripe's @OptIn(PaymentMethodMessagingElementPreview::class)
preview annotation.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 80cf522c-dd1e-4173-83ed-aed0706b3ac0

📥 Commits

Reviewing files that changed from the base of the PR and between 5c84af0 and 6d63683.

📒 Files selected for processing (1)
  • packages/stripe_android/android/build.gradle
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/stripe_android/android/build.gradle

📝 Walkthrough

Walkthrough

Adds a PaymentMethodMessaging Flutter widget and model, implements native platform views on Android and iOS (Compose-backed Android view and UIView-backed iOS view), wires method-channel configuration/height updates, and exposes the widget via package exports.

Changes

Cohort / File(s) Summary
Dart package exports
packages/stripe/lib/flutter_stripe.dart
Re-exported src/widgets/payment_method_messaging.dart from the package barrel.
Flutter widget
packages/stripe/lib/src/widgets/payment_method_messaging.dart
New StatefulWidget PaymentMethodMessaging that creates platform views (iOS UiKitView / Android PlatformViewLink), handles method-channel height updates, and forwards configuration updates.
Platform interface models
packages/stripe_platform_interface/lib/src/models/payment_method_messaging.dart, .../payment_method_messaging.freezed.dart, .../payment_method_messaging.g.dart, packages/stripe_platform_interface/lib/stripe_platform_interface.dart
Added PaymentMethodMessagingConfiguration Freezed model + enum and JSON (de)serialization; exported from platform interface.
Android build & plugin
packages/stripe_android/android/build.gradle, packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt
Added com.stripe:payment-method-messaging dependency and Compose runtime/ui modules; registered flutter.stripe/payment_method_messaging platform view in plugin.
Android platform view
packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt, .../StripePaymentMethodMessagingPlatformViewFactory.kt
New PlatformView embedding a ComposeView, manages PaymentMethodMessagingElement lifecycle, handles updateConfiguration via MethodChannel, reports height via onHeightChanged, and cleans up coroutines/composition.
iOS SPM pin & platform view
packages/stripe_ios/ios/stripe_ios/Package.resolved, .../PaymentMethodMessagingElementFactory.swift, .../Stripe Sdk/PaymentMethodMessagingElementView.swift, .../StripePlugin.swift
Bumped stripe-ios SPM pin; added platform view factory and PaymentMethodMessagingElementView UIView wrapper that applies configuration, reports height, and tears down; registered factory in plugin.

Sequence Diagram

sequenceDiagram
    participant Flutter as Flutter Widget
    participant MethodCh as Method Channel
    participant Android as Android PlatformView
    participant Stripe as Stripe Element
    participant DartCB as Dart Callback

    Flutter->>Android: create platform view (configuration)
    Android->>Stripe: create element (Application)
    activate Stripe
    Stripe-->>Android: element created
    deactivate Stripe

    Android->>Stripe: configure(configuration) [suspend]
    activate Stripe
    Stripe-->>Android: ConfigureResult (Succeeded/NoContent/Failed)
    deactivate Stripe

    Android->>Android: render element.Content() (Compose)
    Android->>MethodCh: invokeMethod("onHeightChange", {"height": h})
    MethodCh->>DartCB: onHeightChange callback invoked

    Flutter->>MethodCh: updateConfiguration(newConfig)
    MethodCh->>Android: receiveMethodCall("updateConfiguration")
    Android->>Stripe: configure(newConfig)
    activate Stripe
    Stripe-->>Android: ConfigureResult
    deactivate Stripe
    Android->>MethodCh: invokeMethod("onHeightChange", {"height": newH})
    MethodCh->>DartCB: onHeightChange callback invoked
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Suggested reviewers

  • jonasbark
  • remonh87

Poem

🐰✨ Hopped in code with tiny feet so fleet,

Compose and UIView now share a seat.
Heights ripple up the channel's song,
Configs applied, the views grow strong.
Promo petals bloom — both platforms meet!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding a PaymentMethodMessaging widget that wraps the Stripe PaymentMethodMessagingElement.
Linked Issues check ✅ Passed The PR fulfills all primary coding objectives from issue #2402: Android implementation with ComposeView, dependency addition, configuration handling, height reporting, and preview API usage.
Out of Scope Changes check ✅ Passed All changes align with stated objectives: Android platform view implementation, iOS refinements, platform-agnostic Dart model, and package exports. No extraneous changes detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/stripe_android/android/build.gradle`:
- Line 67: The dependency declaration implementation
"com.stripe:payment-method-messaging:$stripe_version" references a non-existent
23.1.x train; replace the dynamic/incorrect version usage by pinning this
artifact to a known published version (e.g., 21.19.0) or set a valid explicit
version range that exists on Maven Central so Gradle resolution succeeds; update
the implementation line for com.stripe:payment-method-messaging and, if
necessary, adjust the stripe_version variable or use a hardcoded version string
to ensure PaymentMethodMessagingElement is provided.

In
`@packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt`:
- Around line 45-77: The element state is declared inside composeView.setContent
which can be null when applyConfiguration runs; move the state to a class-level
Compose MutableState so updates from applyConfiguration aren't lost. Concretely:
replace the local "var element by remember {
mutableStateOf<PaymentMethodMessagingElement?>(null) }" and the function
property "private var elementState: ((PaymentMethodMessagingElement?) -> Unit)?
= null" with a class-level "private val elementState =
mutableStateOf<PaymentMethodMessagingElement?>(null)" (or similar MutableState
variable), update composeView.setContent to read elementState.value (and call
elementState.value = ... instead of invoking a lambda), and update
applyConfiguration to set elementState.value when configuring the element; keep
lastReportedHeightPx and the onSizeChanged logic as-is.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 011bac51-83b3-4cde-898f-98476ca88c6d

📥 Commits

Reviewing files that changed from the base of the PR and between 21cf701 and 5c84af0.

📒 Files selected for processing (14)
  • packages/stripe/lib/flutter_stripe.dart
  • packages/stripe/lib/src/widgets/payment_method_messaging.dart
  • packages/stripe_android/android/build.gradle
  • packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt
  • packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt
  • packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformViewFactory.kt
  • packages/stripe_ios/ios/stripe_ios/Package.resolved
  • packages/stripe_ios/ios/stripe_ios/Sources/stripe_ios/PaymentMethodMessagingElementFactory.swift
  • packages/stripe_ios/ios/stripe_ios/Sources/stripe_ios/Stripe Sdk/PaymentMethodMessagingElementView.swift
  • packages/stripe_ios/ios/stripe_ios/Sources/stripe_ios/StripePlugin.swift
  • packages/stripe_platform_interface/lib/src/models/payment_method_messaging.dart
  • packages/stripe_platform_interface/lib/src/models/payment_method_messaging.freezed.dart
  • packages/stripe_platform_interface/lib/src/models/payment_method_messaging.g.dart
  • packages/stripe_platform_interface/lib/stripe_platform_interface.dart

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.1"
implementation "com.stripe:stripe-android:$stripe_version"
implementation "com.stripe:financial-connections:$stripe_version"
implementation "com.stripe:payment-method-messaging:$stripe_version"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# List published versions of com.stripe:payment-method-messaging on Maven Central
# and show the newest version in the 23.1.x train, if any.
curl -s 'https://search.maven.org/solrsearch/select?q=g:com.stripe+AND+a:payment-method-messaging&core=gav&rows=50&wt=json' \
  | jq -r '.response.docs[] | "\(.v)"' \
  | sort -V

Repository: flutter-stripe/flutter_stripe

Length of output: 454


Fix version mismatch: com.stripe:payment-method-messaging does not publish 23.1.x versions.

The artifact com.stripe:payment-method-messaging on Maven Central only provides versions up to 21.19.0. There are no versions in the 23.x train or 23.1.x range. Using 23.1.+ will cause Gradle resolution to fail at build time.

Pin this dependency to 21.19.0 or the lowest compatible version that provides PaymentMethodMessagingElement, or align it with a version range that actually exists for this artifact.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/stripe_android/android/build.gradle` at line 67, The dependency
declaration implementation "com.stripe:payment-method-messaging:$stripe_version"
references a non-existent 23.1.x train; replace the dynamic/incorrect version
usage by pinning this artifact to a known published version (e.g., 21.19.0) or
set a valid explicit version range that exists on Maven Central so Gradle
resolution succeeds; update the implementation line for
com.stripe:payment-method-messaging and, if necessary, adjust the stripe_version
variable or use a hardcoded version string to ensure
PaymentMethodMessagingElement is provided.

Comment on lines +45 to +77
private var elementState: ((PaymentMethodMessagingElement?) -> Unit)? = null
private var lastReportedHeightPx: Int = -1

init {
container.addView(
composeView,
FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT,
),
)
composeView.setContent {
var element by remember { mutableStateOf<PaymentMethodMessagingElement?>(null) }
elementState = { element = it }
val density = LocalDensity.current
Box(
modifier = Modifier.onSizeChanged { size ->
if (size.height != lastReportedHeightPx) {
lastReportedHeightPx = size.height
val heightDp = with(density) { size.height.toDp().value }
channel.invokeMethod(
"onHeightChange",
mapOf("height" to heightDp.toDouble()),
)
}
},
) {
element?.Content(PaymentMethodMessagingElement.Appearance())
}
}

channel.setMethodCallHandler { call, result -> handleMethodCall(call, result) }
applyConfiguration(creationParams)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt | head -150

Repository: flutter-stripe/flutter_stripe

Length of output: 6860


🏁 Script executed:

# Check the entire file to understand the full context
wc -l packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt

Repository: flutter-stripe/flutter_stripe

Length of output: 187


🏁 Script executed:

# Look for the applyConfiguration method
rg -A 30 "fun applyConfiguration" packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt

Repository: flutter-stripe/flutter_stripe

Length of output: 1405


Move element state to class-level Compose state to avoid race condition.

applyConfiguration(creationParams) runs synchronously after composeView.setContent() returns, but AndroidX ComposeView defers its initial composition until the view is attached or createComposition() is explicitly called. This creates a race where the coroutine in applyConfiguration can complete and call elementState?.invoke(element) before the composition has even started—meaning elementState is still null and the configured element is silently dropped.

Suggested fix
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
@@
     private val scope: CoroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
     private var configureJob: Job? = null
-    private var elementState: ((PaymentMethodMessagingElement?) -> Unit)? = null
+    private var currentElement by mutableStateOf<PaymentMethodMessagingElement?>(null)
     private var lastReportedHeightPx: Int = -1
@@
         )
         composeView.setContent {
-            var element by remember { mutableStateOf<PaymentMethodMessagingElement?>(null) }
-            elementState = { element = it }
             val density = LocalDensity.current
             Box(
@@
             ) {
-                element?.Content(PaymentMethodMessagingElement.Appearance())
+                currentElement?.Content(PaymentMethodMessagingElement.Appearance())
             }
         }
@@
     private fun applyConfiguration(params: Map<String?, Any?>?) {
         configureJob?.cancel()
-        elementState?.invoke(null)
+        currentElement = null
         emitCollapsedHeight()
@@
         configureJob = scope.launch {
-            val element = PaymentMethodMessagingElement.create(application)
-            val result = element.configure(configuration)
+            val configuredElement = PaymentMethodMessagingElement.create(application)
+            val result = configuredElement.configure(configuration)
             when (result) {
                 is PaymentMethodMessagingElement.ConfigureResult.Succeeded -> {
-                    elementState?.invoke(element)
+                    currentElement = configuredElement
                 }
                 is PaymentMethodMessagingElement.ConfigureResult.NoContent,
                 is PaymentMethodMessagingElement.ConfigureResult.Failed -> {
-                    elementState?.invoke(null)
+                    currentElement = null
                     emitCollapsedHeight()
                 }
             }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@packages/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripePaymentMethodMessagingPlatformView.kt`
around lines 45 - 77, The element state is declared inside
composeView.setContent which can be null when applyConfiguration runs; move the
state to a class-level Compose MutableState so updates from applyConfiguration
aren't lost. Concretely: replace the local "var element by remember {
mutableStateOf<PaymentMethodMessagingElement?>(null) }" and the function
property "private var elementState: ((PaymentMethodMessagingElement?) -> Unit)?
= null" with a class-level "private val elementState =
mutableStateOf<PaymentMethodMessagingElement?>(null)" (or similar MutableState
variable), update composeView.setContent to read elementState.value (and call
elementState.value = ... instead of invoking a lambda), and update
applyConfiguration to set elementState.value when configuring the element; keep
lastReportedHeightPx and the onSizeChanged logic as-is.

payment-method-messaging:23.1.0 declares androidx.compose.foundation,
androidx.compose.ui, and androidx.compose.runtime at `runtime` scope
in its POM, so Kotlin compilation in this module can't see `Box`,
`Modifier`, `remember`, etc. without explicit `implementation`
dependencies. Pin the versions to 1.10.4 to match Stripe's own
declared dependency graph.
@realmeylisdev
Copy link
Copy Markdown
Contributor Author

CI state on 6d63683 — ready for review

Green on everything the PR controls:

  • analyze — Dart analyze clean
  • test — Dart unit tests
  • ✅ CodeRabbit — no actionable comments
  • ✅ iOS Swift compile — integration test app built and launched successfully (fatal happens in STPAPIClient.swift:154 only when runtime tries to use an empty publishable key)
  • ✅ Android Kotlin compile — integration test ran for 9m44s, through Compose composition, before hitting the same runtime key failure

Remaining red is the pre-existing fork-PR secret limitation, not this PR:

  • build (stripe_js), integration test (Android), and integration test (iOS) all die with some variant of Please call Stripe() with your publishable key. You used an empty string. The workflows inject secrets.STRIPE_PUBLISHABLE_KEY via env: blocks, and GitHub does not expose secrets to pull_request triggers from forks, so those tests short-circuit on every fork-PR commit in this repo. The identical failure is present on 9f1fc850, e9d153ec, and every other commit I've pushed to this branch lineage. Happy to add a test-key fallback or switch to pull_request_target in a separate PR if maintainers want the checks greened for forks.

One fix went in mid-PR (commit 6d63683): payment-method-messaging:23.1.0 declares androidx.compose.ui, androidx.compose.foundation, and androidx.compose.runtime at runtime scope in its POM, so the consuming Kotlin module needed explicit implementation dependencies on those Compose modules to compile. Pinned at 1.10.4 to match Stripe's own declared graph.

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 this pull request may close these issues.

Add Android implementation for PaymentMethodMessaging widget

1 participant