Skip to content

Commit 1580859

Browse files
authored
fix(android): keyboard not appearing on first tap for CardField (#2291)
* fix(android): keyboard not appearing on first tap for CardField (#2286) Wrap Android CardField and CardFormField with Listener + Focus widgets to match iOS implementation. This ensures touch events properly trigger focus requests, which in turn invoke native keyboard display. * fix(stripe_js): migrate tests from dart:js to dart:js_interop
1 parent 903f367 commit 1580859

File tree

5 files changed

+44
-16
lines changed

5 files changed

+44
-16
lines changed

example/lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import 'package:flutter/material.dart';
44
import 'package:flutter_stripe/flutter_stripe.dart';
5-
import 'package:stripe_example/.env.dart';
5+
import '.env.example.dart';
66
import 'screens/screens.dart';
77
import 'widgets/dismiss_focus_overlay.dart';
88

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,12 +431,25 @@ class _MethodChannelCardFieldState extends State<_MethodChannelCardField>
431431

432432
Widget platform;
433433
if (defaultTargetPlatform == TargetPlatform.android) {
434-
platform = _AndroidCardField(
435-
key: _MethodChannelCardField._key,
436-
viewType: _MethodChannelCardField._viewType,
437-
creationParams: creationParams,
438-
onPlatformViewCreated: onPlatformViewCreated,
439-
androidPlatformViewRenderType: widget.androidPlatformViewRenderType,
434+
platform = Listener(
435+
onPointerDown: (_) {
436+
if (!widget.focusNode.hasFocus) {
437+
widget.focusNode.requestFocus();
438+
}
439+
},
440+
child: Focus(
441+
autofocus: widget.autofocus,
442+
descendantsAreFocusable: true,
443+
focusNode: widget.focusNode,
444+
onFocusChange: _handleFrameworkFocusChanged,
445+
child: _AndroidCardField(
446+
key: _MethodChannelCardField._key,
447+
viewType: _MethodChannelCardField._viewType,
448+
creationParams: creationParams,
449+
onPlatformViewCreated: onPlatformViewCreated,
450+
androidPlatformViewRenderType: widget.androidPlatformViewRenderType,
451+
),
452+
),
440453
);
441454
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
442455
platform = Listener(

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,24 @@ class _MethodChannelCardFormFieldState
330330

331331
Widget platform;
332332
if (defaultTargetPlatform == TargetPlatform.android) {
333-
platform = _AndroidCardFormField(
334-
key: _MethodChannelCardFormField._key,
335-
viewType: _MethodChannelCardFormField._viewType,
336-
creationParams: creationParams,
337-
onPlatformViewCreated: onPlatformViewCreated,
333+
platform = Listener(
334+
onPointerDown: (_) {
335+
if (!widget.focusNode.hasFocus) {
336+
widget.focusNode.requestFocus();
337+
}
338+
},
339+
child: Focus(
340+
autofocus: widget.autofocus,
341+
descendantsAreFocusable: true,
342+
focusNode: widget.focusNode,
343+
onFocusChange: _handleFrameworkFocusChanged,
344+
child: _AndroidCardFormField(
345+
key: _MethodChannelCardFormField._key,
346+
viewType: _MethodChannelCardFormField._viewType,
347+
creationParams: creationParams,
348+
onPlatformViewCreated: onPlatformViewCreated,
349+
),
350+
),
338351
);
339352
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
340353
platform = Listener(

packages/stripe_js/test/src/loader/initial_state_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
@TestOn('browser')
44
@Tags(["browser"])
5-
import 'dart:js';
5+
import 'dart:js_interop';
6+
import 'dart:js_interop_unsafe';
67

78
import 'package:test/test.dart';
89

910
void main() {
1011
group('StripeLoader', () {
1112
test('Stripe is not loaded by default', () {
12-
expect(context['Stripe'], isNull);
13+
expect(globalContext['Stripe'], isNull);
1314
});
1415
});
1516
}

packages/stripe_js/test/src/loader/stripe_loader_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
@TestOn('browser')
44
@Tags(["browser"])
5-
import 'dart:js';
5+
import 'dart:js_interop';
6+
import 'dart:js_interop_unsafe';
67

78
import 'package:stripe_js/stripe_js.dart';
89
import 'package:test/test.dart';
@@ -11,7 +12,7 @@ void main() {
1112
group('StripeLoader', () {
1213
test('loads Stripe library', () async {
1314
await loadStripe();
14-
expect(context['Stripe'], isNotNull);
15+
expect(globalContext['Stripe'], isNotNull);
1516
});
1617

1718
test('Stripe can be initialized', () async {

0 commit comments

Comments
 (0)