Skip to content

Commit cadf2f2

Browse files
authored
fix(firebase_ui_oauth): fix OAuth provider buttons paddings (#9991)
1 parent f746d5d commit cadf2f2

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

packages/firebase_ui_auth/lib/firebase_ui_auth.dart

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export 'src/widgets/reauthenticate_dialog.dart';
6161
export 'src/widgets/different_method_sign_in_dialog.dart';
6262
export 'src/widgets/email_sign_up_dialog.dart';
6363
export 'src/widgets/email_link_sign_in_button.dart';
64+
export 'src/widgets/layout_flow_aware_padding.dart';
6465

6566
export 'src/views/login_view.dart';
6667
export 'src/views/phone_input_view.dart';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import 'package:flutter/widgets.dart';
2+
3+
/// Padding widget that takes into account current layout flow.
4+
/// If nearest ancestor is [Row] (or [Flex] with [Flex.direction] equal to
5+
/// [Axis.horizontal]) – horizontal paddings are ignored.
6+
/// Otherwise vertical paddings are ignored.
7+
class LayoutFlowAwarePadding extends StatelessWidget {
8+
final Widget child;
9+
final EdgeInsets padding;
10+
const LayoutFlowAwarePadding({
11+
Key? key,
12+
required this.child,
13+
required this.padding,
14+
}) : super(key: key);
15+
16+
@override
17+
Widget build(BuildContext context) {
18+
Axis? axis;
19+
20+
context.visitAncestorElements((element) {
21+
if (element.widget is Row) {
22+
axis = Axis.horizontal;
23+
return false;
24+
} else if (element.widget is Column) {
25+
axis = Axis.vertical;
26+
return false;
27+
} else if (element.widget is Flex) {
28+
axis = (element.widget as Flex).direction;
29+
return false;
30+
}
31+
32+
return true;
33+
});
34+
35+
EdgeInsets finalPadding;
36+
37+
if (axis == null) {
38+
finalPadding = padding;
39+
} else if (axis == Axis.horizontal) {
40+
finalPadding = EdgeInsets.only(
41+
left: padding.left,
42+
right: padding.right,
43+
);
44+
} else {
45+
finalPadding = EdgeInsets.only(
46+
top: padding.top,
47+
bottom: padding.bottom,
48+
);
49+
}
50+
51+
return Padding(
52+
padding: finalPadding,
53+
child: child,
54+
);
55+
}
56+
}

packages/firebase_ui_oauth/lib/src/oauth_provider_button_base.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class _OAuthProviderButtonBaseState extends State<OAuthProviderButtonBase>
169169
) {
170170
final br = BorderRadius.circular(borderRadius);
171171

172-
return Padding(
172+
return LayoutFlowAwarePadding(
173173
padding: EdgeInsets.all(margin),
174174
child: CupertinoTheme(
175175
data: CupertinoThemeData(
@@ -488,7 +488,7 @@ class _ButtonContainer extends StatelessWidget {
488488

489489
@override
490490
Widget build(BuildContext context) {
491-
return Padding(
491+
return LayoutFlowAwarePadding(
492492
padding: EdgeInsets.all(margin),
493493
child: SizedBox(
494494
height: height,

packages/firebase_ui_oauth/test/flutterfire_ui_oauth_test.dart

+23
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:firebase_auth/firebase_auth.dart' show FirebaseAuth;
2+
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
23
import 'package:flutter/material.dart';
34
import 'package:flutter_svg/flutter_svg.dart';
45
import 'package:flutter_test/flutter_test.dart';
@@ -138,5 +139,27 @@ void main() {
138139

139140
expect(iconFinder, findsOneWidget);
140141
});
142+
143+
testWidgets('has layout flow aware padding', (tester) async {
144+
await tester.pumpWidget(DefaultAssetBundle(
145+
bundle: FakeAssetBundle(),
146+
child: MaterialApp(
147+
home: Scaffold(
148+
body: Row(
149+
children: [
150+
OAuthProviderButtonBase(
151+
provider: provider,
152+
auth: FakeAuth(),
153+
label: 'Sign in with Fake provider',
154+
loadingIndicator: const CircularProgressIndicator(),
155+
)
156+
],
157+
),
158+
),
159+
),
160+
));
161+
162+
expect(find.byType(LayoutFlowAwarePadding), findsOneWidget);
163+
});
141164
});
142165
}

0 commit comments

Comments
 (0)