Skip to content

Commit f32ddb1

Browse files
fix: fix height, component overflow
1 parent 145e5d4 commit f32ddb1

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

packages/stripe/lib/src/widgets/embedded_payment_element.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ class _EmbeddedPaymentElementState extends State<EmbeddedPaymentElement>
161161
final arguments = call.arguments as Map?;
162162
if (arguments != null) {
163163
final height = (arguments['height'] as num?)?.toDouble() ?? 0;
164+
if (height <= 0) return;
165+
164166
setState(() {
165167
_currentHeight = height;
166168
});
@@ -215,9 +217,14 @@ class _EmbeddedPaymentElementState extends State<EmbeddedPaymentElement>
215217
);
216218
}
217219

218-
return SizedBox(
219-
height: _currentHeight > 0 ? _currentHeight : 400,
220-
child: platformView,
220+
return AnimatedSize(
221+
duration: const Duration(milliseconds: 300),
222+
curve: Curves.easeInOut,
223+
alignment: Alignment.topCenter,
224+
child: SizedBox(
225+
height: _currentHeight > 0 ? _currentHeight : 400,
226+
child: platformView,
227+
),
221228
);
222229
}
223230
}

packages/stripe_ios/ios/stripe_ios/Sources/stripe_ios/EmbeddedPaymentElementFactory.swift

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class EmbeddedPaymentElementPlatformView: NSObject, FlutterPlatformView {
109109

110110
@MainActor
111111
private func attachEmbeddedView(_ embeddedElement: EmbeddedPaymentElement) {
112-
delegate = FlutterEmbeddedPaymentElementDelegate(channel: channel, embeddedView: embeddedView)
112+
delegate = FlutterEmbeddedPaymentElementDelegate(channel: channel)
113113
embeddedElement.delegate = delegate
114114

115115
let paymentElementView = embeddedElement.view
@@ -156,20 +156,27 @@ class EmbeddedPaymentElementPlatformView: NSObject, FlutterPlatformView {
156156

157157
class FlutterEmbeddedPaymentElementDelegate: EmbeddedPaymentElementDelegate {
158158
weak var channel: FlutterMethodChannel?
159-
weak var embeddedView: UIView?
159+
private var lastReportedHeight: CGFloat = 0
160160

161-
init(channel: FlutterMethodChannel, embeddedView: UIView) {
161+
init(channel: FlutterMethodChannel) {
162162
self.channel = channel
163-
self.embeddedView = embeddedView
164163
}
165164

166165
func embeddedPaymentElementDidUpdateHeight(embeddedPaymentElement: StripePaymentSheet.EmbeddedPaymentElement) {
167166
guard let channel = channel else { return }
168167

169-
let newHeight = embeddedPaymentElement.view.systemLayoutSizeFitting(
170-
CGSize(width: embeddedPaymentElement.view.bounds.width, height: UIView.layoutFittingCompressedSize.height)
171-
).height
168+
let paymentView = embeddedPaymentElement.view
169+
paymentView.layoutIfNeeded()
172170

171+
let targetSize = paymentView.systemLayoutSizeFitting(
172+
UIView.layoutFittingCompressedSize
173+
)
174+
let newHeight = targetSize.height
175+
176+
guard newHeight > 0 else { return }
177+
guard abs(newHeight - lastReportedHeight) > 1.0 else { return }
178+
179+
lastReportedHeight = newHeight
173180
channel.invokeMethod("onHeightChanged", arguments: ["height": newHeight])
174181
}
175182

@@ -181,7 +188,7 @@ class FlutterEmbeddedPaymentElementDelegate: EmbeddedPaymentElementDelegate {
181188
}
182189

183190
func embeddedPaymentElementWillPresent(embeddedPaymentElement: EmbeddedPaymentElement) {
184-
if let viewController = embeddedView?.window?.rootViewController {
191+
if let viewController = embeddedPaymentElement.view.window?.rootViewController {
185192
embeddedPaymentElement.presentingViewController = viewController
186193
}
187194
}

0 commit comments

Comments
 (0)