From cfe7695714ddc43b2d18748b6eac0b5222739499 Mon Sep 17 00:00:00 2001 From: kevmoo Date: Wed, 25 Mar 2026 11:46:31 -0700 Subject: [PATCH] feat: require Dart 3.9.0 Reformatted --- .../example/lib/decorations.dart | 6 +- .../firebase_ui_auth/example/lib/main.dart | 38 +- .../firebase_ui_auth/example/pubspec.yaml | 2 +- .../firebase_ui_auth/lib/src/actions.dart | 7 +- .../firebase_ui_auth/lib/src/auth_flow.dart | 8 +- .../firebase_ui_auth/lib/src/auth_state.dart | 7 +- .../lib/src/configs/countries.dart | 10 +- .../lib/src/email_verification.dart | 4 +- .../lib/src/flows/email_flow.dart | 5 +- .../lib/src/flows/email_link_flow.dart | 5 +- .../lib/src/flows/oauth_flow.dart | 4 +- .../lib/src/flows/phone_auth_flow.dart | 13 +- packages/firebase_ui_auth/lib/src/mfa.dart | 18 +- .../lib/src/navigation/authentication.dart | 2 +- .../lib/src/providers/auth_provider.dart | 6 +- .../src/providers/email_auth_provider.dart | 7 +- .../src/providers/phone_auth_provider.dart | 21 +- .../screens/email_link_sign_in_screen.dart | 10 +- .../screens/email_verification_screen.dart | 18 +- .../src/screens/forgot_password_screen.dart | 5 +- .../internal/multi_provider_screen.dart | 4 +- .../src/screens/internal/provider_screen.dart | 7 +- .../src/screens/internal/responsive_page.dart | 62 +-- .../lib/src/screens/phone_input_screen.dart | 5 +- .../lib/src/screens/profile_screen.dart | 77 ++-- .../lib/src/screens/sign_in_screen.dart | 4 +- .../src/screens/sms_code_input_screen.dart | 2 +- .../lib/src/styling/style.dart | 9 +- .../lib/src/styling/theme.dart | 10 +- .../firebase_ui_auth/lib/src/validators.dart | 6 +- .../src/views/email_link_sign_in_view.dart | 5 +- .../lib/src/views/login_view.dart | 47 +- .../lib/src/views/phone_input_view.dart | 29 +- .../lib/src/views/reauthenticate_view.dart | 19 +- .../lib/src/widgets/auth_flow_builder.dart | 63 ++- .../widgets/editable_user_display_name.dart | 16 +- .../lib/src/widgets/email_form.dart | 21 +- .../widgets/email_link_sign_in_button.dart | 11 +- .../lib/src/widgets/error_text.dart | 15 +- .../internal/oauth_provider_button.dart | 9 +- .../lib/src/widgets/internal/subtitle.dart | 13 +- .../lib/src/widgets/internal/title.dart | 5 +- .../internal/universal_text_form_field.dart | 4 +- .../widgets/layout_flow_aware_padding.dart | 15 +- .../lib/src/widgets/phone_input.dart | 22 +- .../src/widgets/reauthenticate_dialog.dart | 71 ++- .../lib/src/widgets/sign_out_button.dart | 5 +- .../lib/src/widgets/sms_code_input.dart | 20 +- packages/firebase_ui_auth/pubspec.yaml | 2 +- .../test/flows/email_auth_flow_test.dart | 37 +- .../test/flows/email_link_flow_test.dart | 17 +- .../test/flows/phone_auth_flow_test.dart | 119 ++--- .../test/screens/register_screen_test.dart | 25 +- .../test/screens/sign_in_screen_test.dart | 25 +- .../firebase_ui_auth/test/test_utils.dart | 69 +-- .../views/email_link_sign_in_view_test.dart | 13 +- .../test/views/forgot_password_view_test.dart | 28 +- .../test/views/login_view_test.dart | 85 ++-- .../test/widgets/dialogs_test.dart | 15 +- .../test/widgets/email_form_test.dart | 239 +++++----- .../test/widgets/error_text_test.dart | 13 +- .../test/widgets/phone_input_test.dart | 27 +- .../firebase_ui_database/example/pubspec.yaml | 2 +- .../lib/src/query_builder.dart | 118 +++-- .../lib/src/table_builder.dart | 87 ++-- packages/firebase_ui_database/pubspec.yaml | 2 +- .../example/lib/main.dart | 38 +- .../example/pubspec.yaml | 2 +- .../lib/src/query_builder.dart | 430 +++++++++-------- .../lib/src/table_builder.dart | 118 +++-- packages/firebase_ui_firestore/pubspec.yaml | 2 +- .../test/table_builder_test.dart | 192 +++----- .../bin/add_label.dart | 5 +- .../bin/gen_l10n.dart | 77 ++-- .../example/lib/main.dart | 13 +- .../example/pubspec.yaml | 2 +- .../lib/src/l10n.dart | 3 +- .../firebase_ui_localizations/pubspec.yaml | 2 +- .../test/firebase_ui_localizations_test.dart | 201 ++++---- .../firebase_ui_oauth/example/lib/main.dart | 56 +-- .../example/lib/src/settings.dart | 13 +- .../firebase_ui_oauth/example/pubspec.yaml | 2 +- .../lib/src/oauth_provider_button_base.dart | 60 +-- .../lib/src/oauth_provider_button_style.dart | 10 +- .../lib/src/platform_oauth_sign_in.dart | 28 +- packages/firebase_ui_oauth/pubspec.yaml | 2 +- .../test/flutterfire_ui_oauth_test.dart | 37 +- .../lib/firebase_ui_oauth_apple.dart | 15 +- .../lib/src/theme.dart | 5 +- packages/firebase_ui_oauth_apple/pubspec.yaml | 2 +- .../lib/firebase_ui_oauth_facebook.dart | 20 +- .../lib/src/provider.dart | 28 +- .../firebase_ui_oauth_facebook/pubspec.yaml | 2 +- .../test/facebook_provider_test.dart | 11 +- .../lib/firebase_ui_oauth_google.dart | 15 +- .../lib/src/provider.dart | 35 +- .../firebase_ui_oauth_google/pubspec.yaml | 2 +- .../lib/firebase_ui_oauth_twitter.dart | 15 +- .../lib/src/provider.dart | 40 +- .../firebase_ui_oauth_twitter/pubspec.yaml | 2 +- .../lib/src/loading_button.dart | 5 +- .../lib/src/loading_indicator.dart | 11 +- .../lib/src/universal_button.dart | 6 +- .../lib/src/universal_icon.dart | 12 +- packages/firebase_ui_shared/pubspec.yaml | 2 +- .../test/loading_button_test.dart | 74 ++- .../test/loading_indicator_test.dart | 33 +- .../test/platform_widget_test.dart | 61 +-- .../test/universal_button_test.dart | 145 +++--- .../test/universal_icon_test.dart | 8 +- .../test/universal_scaffold_test.dart | 27 +- .../firebase_ui_storage/example/lib/main.dart | 69 ++- .../example/lib/src/progress_bar_app.dart | 10 +- .../example/lib/src/storage_image_app.dart | 3 +- .../example/lib/src/upload_button_app.dart | 12 +- .../example/lib/storybook.dart | 29 +- .../firebase_ui_storage/example/pubspec.yaml | 2 +- .../firebase_ui_storage/lib/src/config.dart | 5 +- .../lib/src/file_picker.dart | 9 +- packages/firebase_ui_storage/lib/src/lib.dart | 4 +- .../lib/src/paginated_loading_controller.dart | 30 +- .../widgets/default_loading_indicator.dart | 7 +- .../lib/src/widgets/grid_view.dart | 22 +- .../lib/src/widgets/image.dart | 61 +-- .../lib/src/widgets/list_view.dart | 22 +- .../lib/src/widgets/progress_indicator.dart | 11 +- packages/firebase_ui_storage/pubspec.yaml | 2 +- .../firebase_ui_storage/test/config_test.dart | 45 +- .../test/firebase_ui_storage_test.dart | 56 +-- pubspec.yaml | 2 +- scripts/update_dependencies.dart | 20 +- .../firebase_ui_auth/actions_test.dart | 86 ++-- .../firebase_ui_auth/email_form_test.dart | 13 +- .../email_link_sign_in_view_test.dart | 12 +- .../firebase_ui_auth/layout_test.dart | 61 ++- .../phone_verification_test.dart | 223 +++++---- .../database_list_view_test.dart | 135 +++--- .../firestore_list_view_test.dart | 89 ++-- .../firestore_query_builder_test.dart | 433 +++++++++--------- .../apple_sign_in_test.dart | 100 ++-- .../facebook_sign_in_test.dart | 89 ++-- .../google_sign_in_test.dart | 73 ++- .../twitter_sign_in_test.dart | 78 ++-- tests/integration_test/utils.dart | 29 +- tests/lib/main.dart | 4 +- tests/pubspec.yaml | 2 +- 146 files changed, 2283 insertions(+), 3129 deletions(-) diff --git a/packages/firebase_ui_auth/example/lib/decorations.dart b/packages/firebase_ui_auth/example/lib/decorations.dart index b091bc5b2..dc7cb8a71 100644 --- a/packages/firebase_ui_auth/example/lib/decorations.dart +++ b/packages/firebase_ui_auth/example/lib/decorations.dart @@ -42,11 +42,7 @@ SideBuilder sideIcon(IconData icon) { return (context, constraints) { return Padding( padding: const EdgeInsets.all(20), - child: Icon( - icon, - color: Colors.blue, - size: constraints.maxWidth / 3, - ), + child: Icon(icon, color: Colors.blue, size: constraints.maxWidth / 3), ); }; } diff --git a/packages/firebase_ui_auth/example/lib/main.dart b/packages/firebase_ui_auth/example/lib/main.dart index 3e0401d36..ebcb22ca6 100644 --- a/packages/firebase_ui_auth/example/lib/main.dart +++ b/packages/firebase_ui_auth/example/lib/main.dart @@ -85,18 +85,16 @@ class FirebaseAuthUIExample extends StatelessWidget { ), ); - final mfaAction = AuthStateChangeAction( - (context, state) async { - final nav = Navigator.of(context); + final mfaAction = AuthStateChangeAction(( + context, + state, + ) async { + final nav = Navigator.of(context); - await startMFAVerification( - resolver: state.resolver, - context: context, - ); + await startMFAVerification(resolver: state.resolver, context: context); - nav.pushReplacementNamed('/profile'); - }, - ); + nav.pushReplacementNamed('/profile'); + }); return MaterialApp( theme: ThemeData( @@ -224,14 +222,15 @@ class FirebaseAuthUIExample extends StatelessWidget { ); }, '/sms': (context) { - final arguments = ModalRoute.of(context)?.settings.arguments - as Map?; + final arguments = + ModalRoute.of(context)?.settings.arguments + as Map?; return SMSCodeInputScreen( actions: [ AuthStateChangeAction((context, state) { Navigator.of(context).pushReplacementNamed('/profile'); - }) + }), ], flowKey: arguments?['flowKey'], action: arguments?['action'], @@ -240,8 +239,9 @@ class FirebaseAuthUIExample extends StatelessWidget { ); }, '/forgot-password': (context) { - final arguments = ModalRoute.of(context)?.settings.arguments - as Map?; + final arguments = + ModalRoute.of(context)?.settings.arguments + as Map?; return ForgotPasswordScreen( email: arguments?['email'], @@ -274,7 +274,8 @@ class FirebaseAuthUIExample extends StatelessWidget { mfaAction, ], actionCodeSettings: actionCodeSettings, - showMFATile: kIsWeb || + showMFATile: + kIsWeb || platform == TargetPlatform.iOS || platform == TargetPlatform.android, showUnlinkConfirmationDialog: true, @@ -375,10 +376,7 @@ class _AppTrackingTransparencyCardState children: [ const Text('App tracking allowed'), const SizedBox(width: 12), - Switch( - value: _isAllowed, - onChanged: _onToggleChanged, - ), + Switch(value: _isAllowed, onChanged: _onToggleChanged), ], ), ); diff --git a/packages/firebase_ui_auth/example/pubspec.yaml b/packages/firebase_ui_auth/example/pubspec.yaml index 5de246ef1..ed3e60990 100644 --- a/packages/firebase_ui_auth/example/pubspec.yaml +++ b/packages/firebase_ui_auth/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_auth/lib/src/actions.dart b/packages/firebase_ui_auth/lib/src/actions.dart index a5fd9afb7..6860b6490 100644 --- a/packages/firebase_ui_auth/lib/src/actions.dart +++ b/packages/firebase_ui_auth/lib/src/actions.dart @@ -103,11 +103,8 @@ class AccountDeletedAction extends FirebaseUIAction { /// {@endtemplate} class DisplayNameChangedAction extends FirebaseUIAction { /// A callback that is being called when user has changed their display name. - final void Function( - BuildContext context, - String? oldName, - String newName, - ) callback; + final void Function(BuildContext context, String? oldName, String newName) + callback; /// {@macro ui.auth.actions.display_name_changed} DisplayNameChangedAction(this.callback); diff --git a/packages/firebase_ui_auth/lib/src/auth_flow.dart b/packages/firebase_ui_auth/lib/src/auth_flow.dart index 090a0eccf..5bd9c9d09 100644 --- a/packages/firebase_ui_auth/lib/src/auth_flow.dart +++ b/packages/firebase_ui_auth/lib/src/auth_flow.dart @@ -100,10 +100,10 @@ class AuthFlow extends ValueNotifier /// {@macro ui.auth.auth_action} AuthAction? action, - }) : auth = auth ?? fba.FirebaseAuth.instance, - _action = action, - _provider = provider, - super(initialState) { + }) : auth = auth ?? fba.FirebaseAuth.instance, + _action = action, + _provider = provider, + super(initialState) { _provider.authListener = this; _provider.auth = auth ?? fba.FirebaseAuth.instance; } diff --git a/packages/firebase_ui_auth/lib/src/auth_state.dart b/packages/firebase_ui_auth/lib/src/auth_state.dart index a8861a49f..96c3b105c 100644 --- a/packages/firebase_ui_auth/lib/src/auth_state.dart +++ b/packages/firebase_ui_auth/lib/src/auth_state.dart @@ -199,11 +199,8 @@ class AuthStateTransition extends Notification { AuthStateTransition(this.from, this.to, this.controller); } -typedef AuthStateListenerCallback = bool? Function( - AuthState oldState, - AuthState state, - T controller, -); +typedef AuthStateListenerCallback = + bool? Function(AuthState oldState, AuthState state, T controller); /// {@template ui.auth.auth_state.auth_state_listener} /// A [Widget] that could be used to listen auth state transitions. diff --git a/packages/firebase_ui_auth/lib/src/configs/countries.dart b/packages/firebase_ui_auth/lib/src/configs/countries.dart index 64b5fd1bc..860687234 100644 --- a/packages/firebase_ui_auth/lib/src/configs/countries.dart +++ b/packages/firebase_ui_auth/lib/src/configs/countries.dart @@ -53,7 +53,7 @@ final countries = [ { 'name': 'Democratic Republic of the Congo', 'phoneCode': '243', - 'countryCode': 'CD' + 'countryCode': 'CD', }, {'name': 'Denmark', 'phoneCode': '45', 'countryCode': 'DK'}, {'name': 'Djibouti', 'phoneCode': '253', 'countryCode': 'DJ'}, @@ -166,12 +166,12 @@ final countries = [ { 'name': 'Saint Pierre and Miquelon', 'phoneCode': '508', - 'countryCode': 'PM' + 'countryCode': 'PM', }, { 'name': 'Saint Vincent and the Grenadines', 'phoneCode': '1-784', - 'countryCode': 'VC' + 'countryCode': 'VC', }, {'name': 'Samoa', 'phoneCode': '685', 'countryCode': 'WS'}, {'name': 'Sao Tome and Principe', 'phoneCode': '239', 'countryCode': 'ST'}, @@ -202,7 +202,7 @@ final countries = [ { 'name': 'Turks and Caicos Islands', 'phoneCode': '1-649', - 'countryCode': 'TC' + 'countryCode': 'TC', }, {'name': 'U.S. Virgin Islands', 'phoneCode': '1-340', 'countryCode': 'VI'}, {'name': 'Uganda', 'phoneCode': '256', 'countryCode': 'UG'}, @@ -216,7 +216,7 @@ final countries = [ {'name': 'Vietnam', 'phoneCode': '84', 'countryCode': 'VN'}, {'name': 'Yemen', 'phoneCode': '967', 'countryCode': 'YE'}, {'name': 'Zambia', 'phoneCode': '260', 'countryCode': 'ZM'}, - {'name': 'Zimbabwe', 'phoneCode': '263', 'countryCode': 'ZW'} + {'name': 'Zimbabwe', 'phoneCode': '263', 'countryCode': 'ZW'}, ].map(_CountryCodeItem.fromJson); final countriesByCountryCode = countries.fold>( diff --git a/packages/firebase_ui_auth/lib/src/email_verification.dart b/packages/firebase_ui_auth/lib/src/email_verification.dart index 62126e44d..731de0458 100644 --- a/packages/firebase_ui_auth/lib/src/email_verification.dart +++ b/packages/firebase_ui_auth/lib/src/email_verification.dart @@ -47,8 +47,8 @@ class EmailVerificationController extends ValueNotifier StreamSubscription? _linkSubscription; EmailVerificationController(this.auth, {AppLinks? appLinks}) - : _appLinks = appLinks ?? AppLinks(), - super(EmailVerificationState.unresolved) { + : _appLinks = appLinks ?? AppLinks(), + super(EmailVerificationState.unresolved) { final user = auth.currentUser; if (user != null) { diff --git a/packages/firebase_ui_auth/lib/src/flows/email_flow.dart b/packages/firebase_ui_auth/lib/src/flows/email_flow.dart index 6bdf56dde..22f785402 100644 --- a/packages/firebase_ui_auth/lib/src/flows/email_flow.dart +++ b/packages/firebase_ui_auth/lib/src/flows/email_flow.dart @@ -39,10 +39,7 @@ class EmailAuthFlow extends AuthFlow /// {@macro ui.auth.auth_action} super.action, - }) : super( - initialState: AwaitingEmailAndPassword(), - provider: provider, - ); + }) : super(initialState: AwaitingEmailAndPassword(), provider: provider); @override void onBeforeSignIn() { diff --git a/packages/firebase_ui_auth/lib/src/flows/email_link_flow.dart b/packages/firebase_ui_auth/lib/src/flows/email_link_flow.dart index 62f2124ca..7dbf34265 100644 --- a/packages/firebase_ui_auth/lib/src/flows/email_link_flow.dart +++ b/packages/firebase_ui_auth/lib/src/flows/email_link_flow.dart @@ -38,10 +38,7 @@ class EmailLinkFlow extends AuthFlow /// {@macro ui.auth.auth_flow.ctor.provider} required super.provider, - }) : super( - action: AuthAction.signIn, - initialState: const Uninitialized(), - ); + }) : super(action: AuthAction.signIn, initialState: const Uninitialized()); @override void sendLink(String email) { diff --git a/packages/firebase_ui_auth/lib/src/flows/oauth_flow.dart b/packages/firebase_ui_auth/lib/src/flows/oauth_flow.dart index adbc1ca26..bbc509dff 100644 --- a/packages/firebase_ui_auth/lib/src/flows/oauth_flow.dart +++ b/packages/firebase_ui_auth/lib/src/flows/oauth_flow.dart @@ -27,9 +27,7 @@ class OAuthFlow extends AuthFlow /// {@macro ui.auth.auth_controller.auth} super.auth, - }) : super( - initialState: const Uninitialized(), - ); + }) : super(initialState: const Uninitialized()); @override void signIn(TargetPlatform platform) { diff --git a/packages/firebase_ui_auth/lib/src/flows/phone_auth_flow.dart b/packages/firebase_ui_auth/lib/src/flows/phone_auth_flow.dart index 1700d7ce8..926bff584 100644 --- a/packages/firebase_ui_auth/lib/src/flows/phone_auth_flow.dart +++ b/packages/firebase_ui_auth/lib/src/flows/phone_auth_flow.dart @@ -52,11 +52,7 @@ class SMSCodeSent extends AuthState { fba.ConfirmationResult? confirmationResult; /// {@macro ui.auth.flows.phone_auth_flow} - SMSCodeSent({ - this.verificationId, - this.resendToken, - this.confirmationResult, - }); + SMSCodeSent({this.verificationId, this.resendToken, this.confirmationResult}); } /// {@template ui.auth.flows.autoresolution_failed_exception} @@ -112,9 +108,7 @@ class PhoneAuthFlow extends AuthFlow /// {@macro ui.auth.auth_action} super.action, - }) : super( - initialState: AwaitingPhoneNumber(), - ); + }) : super(initialState: AwaitingPhoneNumber()); @override void acceptPhoneNumber( @@ -221,7 +215,8 @@ class SMSCodeRequestedAction extends FirebaseUIAction { AuthAction? action, Object flowKey, String phoneNumber, - ) callback; + ) + callback; /// {@macro ui.auth.flows.phone_auth_flow.sms_code_requested_action} SMSCodeRequestedAction(this.callback); diff --git a/packages/firebase_ui_auth/lib/src/mfa.dart b/packages/firebase_ui_auth/lib/src/mfa.dart index 42c327a25..f086aa443 100644 --- a/packages/firebase_ui_auth/lib/src/mfa.dart +++ b/packages/firebase_ui_auth/lib/src/mfa.dart @@ -10,12 +10,13 @@ import 'package:firebase_ui_auth/src/widgets/internal/universal_page_route.dart' import 'package:flutter/scheduler.dart'; import 'package:flutter/widgets.dart'; -typedef SMSCodeInputScreenBuilder = Widget Function( - BuildContext context, - List actions, - Object flowKey, - AuthAction action, -); +typedef SMSCodeInputScreenBuilder = + Widget Function( + BuildContext context, + List actions, + Object flowKey, + AuthAction action, + ); Future startMFAVerification({ required BuildContext context, @@ -105,10 +106,7 @@ Future startPhoneMFAVerification({ ); } - final pageRoute = createPageRoute( - context: context, - builder: builder, - ); + final pageRoute = createPageRoute(context: context, builder: builder); navigator.push(pageRoute); diff --git a/packages/firebase_ui_auth/lib/src/navigation/authentication.dart b/packages/firebase_ui_auth/lib/src/navigation/authentication.dart index 3e4b37f5b..26fbc8cc1 100644 --- a/packages/firebase_ui_auth/lib/src/navigation/authentication.dart +++ b/packages/firebase_ui_auth/lib/src/navigation/authentication.dart @@ -32,7 +32,7 @@ Future showReauthenticateDialog({ context: context, barrierDismissible: true, barrierLabel: l.cancelButtonLabel, - pageBuilder: (_, __, ___) => FirebaseUIActions.inherit( + pageBuilder: (_, _, _) => FirebaseUIActions.inherit( from: context, child: ReauthenticateDialog( providers: providers, diff --git a/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart b/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart index b2aa30809..17423a2fb 100644 --- a/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart +++ b/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart @@ -61,8 +61,10 @@ abstract class AuthListener { /// An interface that all auth providers should implement. /// Contains shared authentication logic. /// {@endtemplate} -abstract class AuthProvider { +abstract class AuthProvider< + T extends AuthListener, + K extends fba.AuthCredential +> { /// {@macro ui.auth.auth_controller.auth} late fba.FirebaseAuth auth; diff --git a/packages/firebase_ui_auth/lib/src/providers/email_auth_provider.dart b/packages/firebase_ui_auth/lib/src/providers/email_auth_provider.dart index 1474b3fdd..000ca3233 100644 --- a/packages/firebase_ui_auth/lib/src/providers/email_auth_provider.dart +++ b/packages/firebase_ui_auth/lib/src/providers/email_auth_provider.dart @@ -42,10 +42,9 @@ class EmailAuthProvider String password, [ AuthAction action = AuthAction.signIn, ]) { - final credential = fba.EmailAuthProvider.credential( - email: email, - password: password, - ) as fba.EmailAuthCredential; + final credential = + fba.EmailAuthProvider.credential(email: email, password: password) + as fba.EmailAuthCredential; onCredentialReceived(credential, action); } diff --git a/packages/firebase_ui_auth/lib/src/providers/phone_auth_provider.dart b/packages/firebase_ui_auth/lib/src/providers/phone_auth_provider.dart index 17d107768..b4f07fd72 100644 --- a/packages/firebase_ui_auth/lib/src/providers/phone_auth_provider.dart +++ b/packages/firebase_ui_auth/lib/src/providers/phone_auth_provider.dart @@ -100,15 +100,18 @@ class PhoneAuthProvider ); onCredentialReceived(credential, action); } else { - confirmationResult!.confirm(code).then((userCredential) { - if (action == AuthAction.link) { - authListener.onCredentialLinked(userCredential.credential!); - } else { - authListener.onSignedIn(userCredential); - } - }).catchError((err) { - authListener.onError(err); - }); + confirmationResult! + .confirm(code) + .then((userCredential) { + if (action == AuthAction.link) { + authListener.onCredentialLinked(userCredential.credential!); + } else { + authListener.onSignedIn(userCredential); + } + }) + .catchError((err) { + authListener.onError(err); + }); } } diff --git a/packages/firebase_ui_auth/lib/src/screens/email_link_sign_in_screen.dart b/packages/firebase_ui_auth/lib/src/screens/email_link_sign_in_screen.dart index 1052f575c..0d31542bb 100644 --- a/packages/firebase_ui_auth/lib/src/screens/email_link_sign_in_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/email_link_sign_in_screen.dart @@ -71,17 +71,11 @@ class EmailLinkSignInScreen extends ProviderScreen { desktopLayoutDirection: desktopLayoutDirection, child: Padding( padding: const EdgeInsets.all(32), - child: EmailLinkSignInView( - auth: auth, - provider: provider, - ), + child: EmailLinkSignInView(auth: auth, provider: provider), ), ), ); - return FirebaseUIActions( - actions: actions ?? const [], - child: child, - ); + return FirebaseUIActions(actions: actions ?? const [], child: child); } } diff --git a/packages/firebase_ui_auth/lib/src/screens/email_verification_screen.dart b/packages/firebase_ui_auth/lib/src/screens/email_verification_screen.dart index 3a571588c..96e993bd1 100644 --- a/packages/firebase_ui_auth/lib/src/screens/email_verification_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/email_verification_screen.dart @@ -140,8 +140,9 @@ class __EmailVerificationScreenContentState @override void initState() { - _ambiguate(SchedulerBinding.instance)! - .addPostFrameCallback(_sendEmailVerification); + _ambiguate( + SchedulerBinding.instance, + )!.addPostFrameCallback(_sendEmailVerification); super.initState(); } @@ -171,9 +172,7 @@ class __EmailVerificationScreenContentState mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Align( - child: Title(text: l.verifyEmailTitle), - ), + Align(child: Title(text: l.verifyEmailTitle)), const SizedBox(height: 32), Text(l.verificationEmailSentText), const SizedBox(height: 32), @@ -206,7 +205,7 @@ class __EmailVerificationScreenContentState widget.actionCodeSettings, ); }, - ) + ), ], if (state == EmailVerificationState.failed) ...[ const SizedBox(height: 16), @@ -217,10 +216,11 @@ class __EmailVerificationScreenContentState variant: ButtonVariant.text, text: l.goBackButtonLabel, onPressed: () { - FirebaseUIAction.ofType(context) - ?.callback(context); + FirebaseUIAction.ofType( + context, + )?.callback(context); }, - ) + ), ], ); } diff --git a/packages/firebase_ui_auth/lib/src/screens/forgot_password_screen.dart b/packages/firebase_ui_auth/lib/src/screens/forgot_password_screen.dart index b199b612d..1b68c7660 100644 --- a/packages/firebase_ui_auth/lib/src/screens/forgot_password_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/forgot_password_screen.dart @@ -78,10 +78,7 @@ class ForgotPasswordScreen extends StatelessWidget { breakpoint: breakpoint, maxWidth: maxWidth, contentFlex: 1, - child: Padding( - padding: const EdgeInsets.all(32), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(32), child: child), ), ); } diff --git a/packages/firebase_ui_auth/lib/src/screens/internal/multi_provider_screen.dart b/packages/firebase_ui_auth/lib/src/screens/internal/multi_provider_screen.dart index 4784ceabc..b1d04baf7 100644 --- a/packages/firebase_ui_auth/lib/src/screens/internal/multi_provider_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/internal/multi_provider_screen.dart @@ -17,8 +17,8 @@ abstract class MultiProviderScreen extends Widget { super.key, fba.FirebaseAuth? auth, List? providers, - }) : _auth = auth, - _providers = providers; + }) : _auth = auth, + _providers = providers; List get providers { if (_providers != null) { diff --git a/packages/firebase_ui_auth/lib/src/screens/internal/provider_screen.dart b/packages/firebase_ui_auth/lib/src/screens/internal/provider_screen.dart index 0dcae452e..690b24939 100644 --- a/packages/firebase_ui_auth/lib/src/screens/internal/provider_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/internal/provider_screen.dart @@ -28,9 +28,6 @@ abstract class ProviderScreen extends StatelessWidget { return config; } - const ProviderScreen({ - super.key, - T? provider, - this.auth, - }) : _provider = provider; + const ProviderScreen({super.key, T? provider, this.auth}) + : _provider = provider; } diff --git a/packages/firebase_ui_auth/lib/src/screens/internal/responsive_page.dart b/packages/firebase_ui_auth/lib/src/screens/internal/responsive_page.dart index 4ae74837a..8fc03c900 100644 --- a/packages/firebase_ui_auth/lib/src/screens/internal/responsive_page.dart +++ b/packages/firebase_ui_auth/lib/src/screens/internal/responsive_page.dart @@ -10,11 +10,12 @@ import '../../widgets/internal/keyboard_appearence_listener.dart'; /// A builder that builds the contents of the header. /// Used only on mobile platforms. /// {@endtemplate} -typedef HeaderBuilder = Widget Function( - BuildContext context, - BoxConstraints constraints, - double shrinkOffset, -); +typedef HeaderBuilder = + Widget Function( + BuildContext context, + BoxConstraints constraints, + double shrinkOffset, + ); const defaultHeaderImageHeight = 150.0; @@ -35,11 +36,8 @@ class HeaderImageSliverDelegate extends SliverPersistentHeaderDelegate { bool overlapsContent, ) { return LayoutBuilder( - builder: (context, constraints) => builder( - context, - constraints, - shrinkOffset / maxExtent, - ), + builder: (context, constraints) => + builder(context, constraints, shrinkOffset / maxExtent), ); } @@ -58,10 +56,8 @@ class HeaderImageSliverDelegate extends SliverPersistentHeaderDelegate { /// /// Used only on desktop platforms. /// {@endtemplate} -typedef SideBuilder = Widget Function( - BuildContext context, - BoxConstraints constraints, -); +typedef SideBuilder = + Widget Function(BuildContext context, BoxConstraints constraints); class ResponsivePage extends StatefulWidget { /// Main content of the page @@ -143,10 +139,7 @@ class _ResponsivePageState extends State { Widget build(BuildContext context) { final breakpoint = widget.breakpoint; - final content = KeyedSubtree( - key: key, - child: widget.child, - ); + final content = KeyedSubtree(key: key, child: widget.child); return LayoutBuilder( builder: (context, constraints) { @@ -182,7 +175,7 @@ class _ResponsivePageState extends State { ], ), ), - ) + ), ], ), ), @@ -204,31 +197,22 @@ class _ResponsivePageState extends State { ), ), SliverList( - delegate: SliverChildListDelegate.fixed( - [ - content, - ValueListenableBuilder( - valueListenable: paddingListenable, - builder: (context, value, _) { - return SizedBox(height: value); - }, - ), - ], - ), - ) + delegate: SliverChildListDelegate.fixed([ + content, + ValueListenableBuilder( + valueListenable: paddingListenable, + builder: (context, value, _) { + return SizedBox(height: value); + }, + ), + ]), + ), ], ), ), ); } else { - return Center( - child: ListView( - shrinkWrap: true, - children: [ - content, - ], - ), - ); + return Center(child: ListView(shrinkWrap: true, children: [content])); } }, ); diff --git a/packages/firebase_ui_auth/lib/src/screens/phone_input_screen.dart b/packages/firebase_ui_auth/lib/src/screens/phone_input_screen.dart index 0742edbd8..1375ffce6 100644 --- a/packages/firebase_ui_auth/lib/src/screens/phone_input_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/phone_input_screen.dart @@ -93,10 +93,7 @@ class PhoneInputScreen extends StatelessWidget { context: context, builder: (_) => FirebaseUIActions.inherit( from: context, - child: SMSCodeInputScreen( - action: action, - flowKey: flowKey, - ), + child: SMSCodeInputScreen(action: action, flowKey: flowKey), ), ), ); diff --git a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart index 1c414dbe1..86720783b 100644 --- a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart @@ -57,7 +57,7 @@ class _AvailableProvidersRowState extends State<_AvailableProvidersRow> { context: context, barrierDismissible: true, barrierLabel: '', - pageBuilder: (context, _, __) { + pageBuilder: (context, _, _) { return EmailSignUpDialog( provider: provider as EmailAuthProvider, auth: widget.auth, @@ -139,10 +139,7 @@ class _EditButton extends StatelessWidget { final bool isEditing; final VoidCallback? onPressed; - const _EditButton({ - required this.isEditing, - this.onPressed, - }); + const _EditButton({required this.isEditing, this.onPressed}); @override Widget build(BuildContext context) { @@ -260,10 +257,7 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> { width: size, height: size, child: unlinkingProvider == providerId - ? LoadingIndicator( - size: size - (size / 4), - borderWidth: 1, - ) + ? LoadingIndicator(size: size - (size / 4), borderWidth: 1) : providerIcon(context, provider), ), if (unlinkingProvider != providerId) @@ -301,13 +295,14 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> { Widget build(BuildContext context) { final l = FirebaseUILocalizations.labelsOf(context); Widget child = Row( - children: [ - for (var provider in widget.providers) - buildProviderIcon(context, provider) - ] - .map((e) => [e, const SizedBox(width: 8)]) - .expand((element) => element) - .toList(), + children: + [ + for (var provider in widget.providers) + buildProviderIcon(context, provider), + ] + .map((e) => [e, const SizedBox(width: 8)]) + .expand((element) => element) + .toList(), ); if (widget.providers.length > 1) { @@ -315,10 +310,7 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> { children: [ Expanded(child: child), const SizedBox(width: 8), - _EditButton( - isEditing: isEditing, - onPressed: _toggleEdit, - ), + _EditButton(isEditing: isEditing, onPressed: _toggleEdit), ], ); } @@ -337,10 +329,7 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> { class _EmailVerificationBadge extends StatefulWidget { final fba.FirebaseAuth auth; final fba.ActionCodeSettings? actionCodeSettings; - const _EmailVerificationBadge({ - required this.auth, - this.actionCodeSettings, - }); + const _EmailVerificationBadge({required this.auth, this.actionCodeSettings}); @override State<_EmailVerificationBadge> createState() => @@ -406,7 +395,8 @@ class _EmailVerificationBadgeState extends State<_EmailVerificationBadge> { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Subtitle( - text: state == EmailVerificationState.sent || + text: + state == EmailVerificationState.sent || state == EmailVerificationState.pending ? l.verificationEmailSentTextShort : l.emailIsNotVerifiedText, @@ -415,7 +405,7 @@ class _EmailVerificationBadgeState extends State<_EmailVerificationBadge> { if (state == EmailVerificationState.pending) ...[ const SizedBox(height: 8), Text(l.checkEmailHintText), - ] + ], ], ), ), @@ -463,9 +453,9 @@ class _EmailVerificationBadgeState extends State<_EmailVerificationBadge> { onPressed: () { setState(service.dismiss); }, - ) + ), ], - ) + ), ], ), ); @@ -642,7 +632,7 @@ class _MFAToggleState extends State<_MFAToggle> { Navigator.of(context).popUntil((route) => route == currentRoute); } } - }) + }), ], ); @@ -667,22 +657,20 @@ class _MFAToggleState extends State<_MFAToggle> { color: getColor(), ), const SizedBox(width: 8), - Expanded( - child: Text(widget.enrolled ? l.on : l.off), - ), + Expanded(child: Text(widget.enrolled ? l.on : l.off)), LoadingButton( variant: ButtonVariant.text, label: widget.enrolled ? l.disable : l.enable, onTap: widget.enrolled ? _disable : _enable, isLoading: isLoading, - ) + ), ], ), if (exception != null) Padding( padding: const EdgeInsets.only(top: 8.0), child: ErrorText(exception: exception!), - ) + ), ], ); } @@ -825,7 +813,8 @@ class ProfileScreen extends MultiProviderScreen { final user = auth.currentUser!; - final avatarWidget = avatar ?? + final avatarWidget = + avatar ?? Align( child: UserAvatar( auth: auth, @@ -927,10 +916,7 @@ class ProfileScreen extends MultiProviderScreen { ), ...children, const SizedBox(height: 16), - SignOutButton( - auth: auth, - variant: ButtonVariant.outlined, - ), + SignOutButton(auth: auth, variant: ButtonVariant.outlined), const SizedBox(height: 8), DeleteAccountButton( auth: auth, @@ -965,22 +951,15 @@ class ProfileScreen extends MultiProviderScreen { if (isCupertino) { child = CupertinoPageScaffold( navigationBar: cupertinoNavigationBar, - child: SafeArea( - child: SingleChildScrollView(child: child), - ), + child: SafeArea(child: SingleChildScrollView(child: child)), ); } else { child = Scaffold( appBar: appBar, - body: SafeArea( - child: SingleChildScrollView(child: body), - ), + body: SafeArea(child: SingleChildScrollView(child: body)), ); } - return FirebaseUIActions( - actions: actions ?? const [], - child: child, - ); + return FirebaseUIActions(actions: actions ?? const [], child: child); } } diff --git a/packages/firebase_ui_auth/lib/src/screens/sign_in_screen.dart b/packages/firebase_ui_auth/lib/src/screens/sign_in_screen.dart index cda57f1d8..79b92bd8d 100644 --- a/packages/firebase_ui_auth/lib/src/screens/sign_in_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/sign_in_screen.dart @@ -126,9 +126,7 @@ class SignInScreen extends MultiProviderScreen { @override Widget build(BuildContext context) { - final actions = [ - ...this.actions, - ]; + final actions = [...this.actions]; return FirebaseUIActions( actions: actions, diff --git a/packages/firebase_ui_auth/lib/src/screens/sms_code_input_screen.dart b/packages/firebase_ui_auth/lib/src/screens/sms_code_input_screen.dart index 558f4fc45..55eb050db 100644 --- a/packages/firebase_ui_auth/lib/src/screens/sms_code_input_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/sms_code_input_screen.dart @@ -133,7 +133,7 @@ class SMSCodeInputScreen extends StatelessWidget { _reset(); Navigator.of(context).pop(); }, - ) + ), ], ), ), diff --git a/packages/firebase_ui_auth/lib/src/styling/style.dart b/packages/firebase_ui_auth/lib/src/styling/style.dart index db1fe3f1c..46b91e911 100644 --- a/packages/firebase_ui_auth/lib/src/styling/style.dart +++ b/packages/firebase_ui_auth/lib/src/styling/style.dart @@ -17,8 +17,8 @@ abstract class FirebaseUIStyle { BuildContext context, T defaultValue, ) { - final el = - context.getElementForInheritedWidgetOfExactType(); + final el = context + .getElementForInheritedWidgetOfExactType(); if (el == null) return defaultValue; context.dependOnInheritedElement(el, aspect: T); @@ -39,9 +39,6 @@ abstract class FirebaseUIStyle { /// Wires the style with the widget tree and makes sure it is accessible /// from the [child] or its descendants. Widget mount({required Widget child}) { - return FirebaseUITheme( - styles: {this}, - child: child, - ); + return FirebaseUITheme(styles: {this}, child: child); } } diff --git a/packages/firebase_ui_auth/lib/src/styling/theme.dart b/packages/firebase_ui_auth/lib/src/styling/theme.dart index 4fc52a48f..31df173dc 100644 --- a/packages/firebase_ui_auth/lib/src/styling/theme.dart +++ b/packages/firebase_ui_auth/lib/src/styling/theme.dart @@ -10,10 +10,7 @@ typedef StylesMap = Map; StylesMap _buildStylesMap(Set styles) { return styles.fold({}, (acc, el) { - return { - ...acc, - el.runtimeType: el, - }; + return {...acc, el.runtimeType: el}; }); } @@ -68,8 +65,9 @@ class FirebaseUIThemeElement extends InheritedModelElement { @override void mount(Element? parent, Object? newSlot) { - _parent = parent?.getElementForInheritedWidgetOfExactType() - as FirebaseUIThemeElement?; + _parent = + parent?.getElementForInheritedWidgetOfExactType() + as FirebaseUIThemeElement?; if (_parent != null) { dependOnInheritedElement(_parent!); diff --git a/packages/firebase_ui_auth/lib/src/validators.dart b/packages/firebase_ui_auth/lib/src/validators.dart index be8c5b649..a10d090e8 100644 --- a/packages/firebase_ui_auth/lib/src/validators.dart +++ b/packages/firebase_ui_auth/lib/src/validators.dart @@ -70,10 +70,8 @@ class EmailValidator extends Validator { class ConfirmPasswordValidator extends Validator { final TextEditingController controller; - ConfirmPasswordValidator( - this.controller, - String errorText, - ) : super(errorText, []); + ConfirmPasswordValidator(this.controller, String errorText) + : super(errorText, []); @override String? validate(String? value) { diff --git a/packages/firebase_ui_auth/lib/src/views/email_link_sign_in_view.dart b/packages/firebase_ui_auth/lib/src/views/email_link_sign_in_view.dart index 73278cdb9..fe80ddd95 100644 --- a/packages/firebase_ui_auth/lib/src/views/email_link_sign_in_view.dart +++ b/packages/firebase_ui_auth/lib/src/views/email_link_sign_in_view.dart @@ -45,10 +45,7 @@ class _EmailLinkSignInViewState extends State { Widget build(BuildContext context) { final l = FirebaseUILocalizations.labelsOf(context); final formKey = GlobalKey(); - const statesToHideForm = [ - AwaitingDynamicLink, - SigningIn, - ]; + const statesToHideForm = [AwaitingDynamicLink, SigningIn]; return AuthFlowBuilder( auth: widget.auth, diff --git a/packages/firebase_ui_auth/lib/src/views/login_view.dart b/packages/firebase_ui_auth/lib/src/views/login_view.dart index d81bdfb5c..f2617c484 100644 --- a/packages/firebase_ui_auth/lib/src/views/login_view.dart +++ b/packages/firebase_ui_auth/lib/src/views/login_view.dart @@ -13,10 +13,8 @@ import 'package:flutter/material.dart' hide Title; import '../widgets/internal/title.dart'; -typedef AuthViewContentBuilder = Widget Function( - BuildContext context, - AuthAction action, -); +typedef AuthViewContentBuilder = + Widget Function(BuildContext context, AuthAction action); /// {@template ui.auth.views.login_view} /// A view that could be used to build a custom [SignInScreen] or @@ -91,9 +89,9 @@ class _LoginViewState extends State { } Widget _buildOAuthButtons(TargetPlatform platform) { - final oauthProviders = widget.providers - .whereType() - .where((element) => element.supportsPlatform(platform)); + final oauthProviders = widget.providers.whereType().where( + (element) => element.supportsPlatform(platform), + ); _buttonsBuilt = true; @@ -107,10 +105,7 @@ class _LoginViewState extends State { }).toList(); if (widget.oauthButtonVariant == OAuthButtonVariant.icon_and_text) { - return Column( - mainAxisSize: MainAxisSize.min, - children: oauthButtonsList, - ); + return Column(mainAxisSize: MainAxisSize.min, children: oauthButtonsList); } else { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -167,23 +162,17 @@ class _LoginViewState extends State { Title(text: title), const SizedBox(height: 16), if (widget.subtitleBuilder != null) - widget.subtitleBuilder!( - context, - _action, - ), + widget.subtitleBuilder!(context, _action), if (_showAuthActionSwitch) ...[ Text.rich( TextSpan( children: [ - TextSpan( - text: '$hint ', - style: hintStyle, - ), + TextSpan(text: '$hint ', style: hintStyle), TextSpan( text: actionText, - style: Theme.of(context).textTheme.labelLarge?.copyWith( - color: registerTextColor, - ), + style: Theme.of( + context, + ).textTheme.labelLarge?.copyWith(color: registerTextColor), mouseCursor: SystemMouseCursors.click, recognizer: TapGestureRecognizer() ..onTap = () => _handleDifferentAuthAction(context), @@ -192,7 +181,7 @@ class _LoginViewState extends State { ), ), const SizedBox(height: 16), - ] + ], ]; } @@ -228,7 +217,7 @@ class _LoginViewState extends State { actionButtonLabelOverride: widget.actionButtonLabelOverride, showPasswordVisibilityToggle: widget.showPasswordVisibilityToggle, - ) + ), ] else if (provider is PhoneAuthProvider) ...[ const SizedBox(height: 8), PhoneVerificationButton( @@ -239,17 +228,11 @@ class _LoginViewState extends State { const SizedBox(height: 8), ] else if (provider is EmailLinkAuthProvider) ...[ const SizedBox(height: 8), - EmailLinkSignInButton( - auth: widget.auth, - provider: provider, - ), + EmailLinkSignInButton(auth: widget.auth, provider: provider), ] else if (provider is OAuthProvider && !_buttonsBuilt) _buildOAuthButtons(platform), if (widget.footerBuilder != null) - widget.footerBuilder!( - context, - _action, - ), + widget.footerBuilder!(context, _action), ], ), ); diff --git a/packages/firebase_ui_auth/lib/src/views/phone_input_view.dart b/packages/firebase_ui_auth/lib/src/views/phone_input_view.dart index 4935f0029..dc6238ec7 100644 --- a/packages/firebase_ui_auth/lib/src/views/phone_input_view.dart +++ b/packages/firebase_ui_auth/lib/src/views/phone_input_view.dart @@ -10,12 +10,13 @@ import 'package:firebase_ui_localizations/firebase_ui_localizations.dart'; import '../widgets/internal/title.dart'; -typedef SMSCodeRequestedCallback = void Function( - BuildContext context, - AuthAction? action, - Object flowKey, - String phoneNumber, -); +typedef SMSCodeRequestedCallback = + void Function( + BuildContext context, + AuthAction? action, + Object flowKey, + String phoneNumber, + ); typedef PhoneNumberSubmitCallback = void Function(String phoneNumber); @@ -77,10 +78,7 @@ class _PhoneInputViewState extends State { if (widget.onSubmit != null) { widget.onSubmit!(phoneNumber); } else { - ctrl.acceptPhoneNumber( - phoneNumber, - widget.multiFactorSession, - ); + ctrl.acceptPhoneNumber(phoneNumber, widget.multiFactorSession); } }; @@ -94,7 +92,8 @@ class _PhoneInputViewState extends State { @override Widget build(BuildContext context) { final l = FirebaseUILocalizations.labelsOf(context); - final countryCode = Localizations.localeOf(context).countryCode ?? + final countryCode = + Localizations.localeOf(context).countryCode ?? WidgetsBinding.instance.platformDispatcher.locale.countryCode; return AuthFlowBuilder( @@ -103,9 +102,11 @@ class _PhoneInputViewState extends State { auth: widget.auth, listener: (oldState, newState, controller) { if (newState is SMSCodeRequested) { - final cb = widget.onSMSCodeRequested ?? - FirebaseUIAction.ofType(context) - ?.callback; + final cb = + widget.onSMSCodeRequested ?? + FirebaseUIAction.ofType( + context, + )?.callback; cb?.call( context, diff --git a/packages/firebase_ui_auth/lib/src/views/reauthenticate_view.dart b/packages/firebase_ui_auth/lib/src/views/reauthenticate_view.dart index 6df87c1f0..b26423e0c 100644 --- a/packages/firebase_ui_auth/lib/src/views/reauthenticate_view.dart +++ b/packages/firebase_ui_auth/lib/src/views/reauthenticate_view.dart @@ -49,15 +49,12 @@ class ReauthenticateView extends StatelessWidget { final linkedProviders = (auth ?? fba.FirebaseAuth.instance).currentUser!.providerData; - final providersMap = this.providers.fold>( - {}, - (map, provider) { - return { - ...map, - provider.providerId: provider, - }; - }, - ); + final providersMap = this.providers.fold>({}, ( + map, + provider, + ) { + return {...map, provider.providerId: provider}; + }); List providers = []; @@ -87,9 +84,7 @@ class ReauthenticateView extends StatelessWidget { }); return FirebaseUIActions( - actions: [ - onSignedInAction, - ], + actions: [onSignedInAction], child: LoginView( action: AuthAction.signIn, providers: providers, diff --git a/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart b/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart index 042a8dd79..461a861d7 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart @@ -14,36 +14,38 @@ import '../auth_state.dart'; /// A callback that is being called every time the [AuthFlow] changes it's /// state. Returned widget is rendered as a child of [AuthFlowBuilder]. /// {@endtemplate} -typedef AuthFlowBuilderCallback = Widget Function( - BuildContext context, +typedef AuthFlowBuilderCallback = + Widget Function( + BuildContext context, - /// Current [AuthState] of the [AuthFlow]. - AuthState state, + /// Current [AuthState] of the [AuthFlow]. + AuthState state, - /// An instance of [AuthController] that could be used to control the - /// [AuthFlow]. - T ctrl, + /// An instance of [AuthController] that could be used to control the + /// [AuthFlow]. + T ctrl, - /// A [Widget] that was provided to the [AuthFlowBuilder]. - Widget? child, -); + /// A [Widget] that was provided to the [AuthFlowBuilder]. + Widget? child, + ); /// {@template ui.auth.widgets.auth_flow_builder.state_transition_listener} /// A callback that is being called when [AuthFlow] changes it's state. /// /// Invoked before the widget is built. /// {@endtemplate} -typedef StateTransitionListener = void Function( - /// Previous state of the [AuthFlow]. - AuthState oldState, +typedef StateTransitionListener = + void Function( + /// Previous state of the [AuthFlow]. + AuthState oldState, - /// Current state of the [AuthFlow]. - AuthState newState, + /// Current state of the [AuthFlow]. + AuthState newState, - /// An instance of the [AuthController] that could be used to manipulate the - /// [AuthFlow]. - T controller, -); + /// An instance of the [AuthController] that could be used to manipulate the + /// [AuthFlow]. + T controller, + ); /// {@template ui.auth.widgets.auth_flow_builder} /// A widget that is used to wire up the [AuthFlow]s with the widget tree. @@ -168,9 +170,9 @@ class AuthFlowBuilder extends StatefulWidget { this.auth, this.flow, }) : assert( - builder != null || child != null, - 'Either child or builder should be provided', - ); + builder != null || child != null, + 'Either child or builder should be provided', + ); @override // ignore: library_private_types_in_public_api @@ -192,7 +194,7 @@ class _AuthFlowBuilderState late AuthProvider provider = widget.provider ?? _createDefaultProvider(); - Widget _defaultBuilder(BuildContext _, AuthState __, T ___, Widget? ____) { + Widget _defaultBuilder(BuildContext _, AuthState _, T _, Widget? _) { return widget.child!; } @@ -211,7 +213,8 @@ class _AuthFlowBuilderState }; } - action = widget.action ?? + action = + widget.action ?? (flow.auth.currentUser != null ? AuthAction.link : AuthAction.signIn); flow.addListener(onFlowStateChanged); @@ -246,10 +249,7 @@ class _AuthFlowBuilderState auth: widget.auth, ); } else if (provider is EmailLinkAuthProvider) { - return EmailLinkFlow( - provider: provider, - auth: widget.auth, - ); + return EmailLinkFlow(provider: provider, auth: widget.auth); } else if (provider is OAuthProvider) { return OAuthFlow( provider: provider, @@ -287,12 +287,7 @@ class _AuthFlowBuilderState child: ValueListenableBuilder( valueListenable: flow, builder: (context, value, _) { - final child = builder( - context, - value, - flow as T, - widget.child, - ); + final child = builder(context, value, flow as T, widget.child); return AuthStateProvider(state: value, child: child); }, diff --git a/packages/firebase_ui_auth/lib/src/widgets/editable_user_display_name.dart b/packages/firebase_ui_auth/lib/src/widgets/editable_user_display_name.dart index ef161d94d..af9ddf22c 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/editable_user_display_name.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/editable_user_display_name.dart @@ -36,10 +36,7 @@ class EditableUserDisplayName extends StatefulWidget { final fba.FirebaseAuth? auth; /// {@macro ui.auth.widgets.editable_user_display_name} - const EditableUserDisplayName({ - super.key, - this.auth, - }); + const EditableUserDisplayName({super.key, this.auth}); @override // ignore: library_private_types_in_public_api @@ -76,11 +73,9 @@ class _EditableUserDisplayNameState extends State { if (!mounted) return; - FirebaseUIAction.ofType(context)?.callback( + FirebaseUIAction.ofType( context, - previousDisplayName, - ctrl.text, - ); + )?.callback(context, previousDisplayName, ctrl.text); } finally { setState(() { _editing = false; @@ -165,10 +160,7 @@ class _EditableUserDisplayNameState extends State { if (_isLoading) const LoadingIndicator(size: 24, borderWidth: 1) else - Align( - alignment: Alignment.topLeft, - child: iconButton, - ), + Align(alignment: Alignment.topLeft, child: iconButton), ], ), ), diff --git a/packages/firebase_ui_auth/lib/src/widgets/email_form.dart b/packages/firebase_ui_auth/lib/src/widgets/email_form.dart index fdcadd7bd..839860801 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/email_form.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/email_form.dart @@ -70,9 +70,9 @@ class EmailFormStyle extends FirebaseUIStyle { @override Widget applyToMaterialTheme(BuildContext context, Widget child) { return Theme( - data: Theme.of(context).copyWith( - inputDecorationTheme: inputDecorationTheme, - ), + data: Theme.of( + context, + ).copyWith(inputDecorationTheme: inputDecorationTheme), child: child, ); } @@ -237,10 +237,7 @@ class _SignInFormContentState extends State<_SignInFormContent> { if (widget.onSubmit != null) { widget.onSubmit!(email, passwordCtrl.text); } else { - ctrl.setEmailAndPassword( - email, - password ?? passwordCtrl.text, - ); + ctrl.setEmailAndPassword(email, password ?? passwordCtrl.text); } } } @@ -275,8 +272,9 @@ class _SignInFormContentState extends State<_SignInFormContent> { alignment: Alignment.centerRight, child: ForgotPasswordButton( onPressed: () { - final navAction = - FirebaseUIAction.ofType(context); + final navAction = FirebaseUIAction.ofType( + context, + ); final email = widget.email ?? emailCtrl.text; if (navAction != null) { @@ -305,7 +303,7 @@ class _SignInFormContentState extends State<_SignInFormContent> { ConfirmPasswordValidator( passwordCtrl, l.confirmPasswordDoesNotMatchErrorText, - ) + ), ]), placeholder: l.confirmPasswordInputLabel, showVisibilityToggle: widget.showPasswordVisibilityToggle, @@ -316,7 +314,8 @@ class _SignInFormContentState extends State<_SignInFormContent> { Builder( builder: (context) { final state = AuthState.of(context); - final style = widget.style ?? + final style = + widget.style ?? FirebaseUIStyle.ofType( context, const EmailFormStyle(), diff --git a/packages/firebase_ui_auth/lib/src/widgets/email_link_sign_in_button.dart b/packages/firebase_ui_auth/lib/src/widgets/email_link_sign_in_button.dart index 7fe16b162..02b45ecaa 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/email_link_sign_in_button.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/email_link_sign_in_button.dart @@ -27,11 +27,7 @@ class EmailLinkSignInButton extends StatelessWidget { final EmailLinkAuthProvider provider; /// {@macro ui.auth.widget.email_link_sign_in_button} - const EmailLinkSignInButton({ - super.key, - required this.provider, - this.auth, - }); + const EmailLinkSignInButton({super.key, required this.provider, this.auth}); @override Widget build(BuildContext context) { @@ -52,10 +48,7 @@ class EmailLinkSignInButton extends StatelessWidget { builder: (_) { return FirebaseUIActions.inherit( from: context, - child: EmailLinkSignInScreen( - auth: auth, - provider: provider, - ), + child: EmailLinkSignInScreen(auth: auth, provider: provider), ); }, ), diff --git a/packages/firebase_ui_auth/lib/src/widgets/error_text.dart b/packages/firebase_ui_auth/lib/src/widgets/error_text.dart index e7d48f93c..2ff8ea019 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/error_text.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/error_text.dart @@ -55,7 +55,8 @@ class ErrorText extends StatelessWidget { static String Function( BuildContext context, fba.FirebaseAuthException exception, - )? localizeError; + )? + localizeError; /// A way to customize error message for [PlatformException] /// @@ -65,10 +66,8 @@ class ErrorText extends StatelessWidget { /// if (e.code == "network_error") return "Please check your internet connection."; /// return "Oh no! Something went wrong."; /// } - static String Function( - BuildContext context, - PlatformException exception, - )? localizePlatformError; + static String Function(BuildContext context, PlatformException exception)? + localizePlatformError; /// A way to customize the widget that is used across the library to show /// error hints. By default a localized text is used with a color set to @@ -84,11 +83,7 @@ class ErrorText extends StatelessWidget { final TextAlign? textAlign; /// {@macro ui.auth.widgets.error_text} - const ErrorText({ - super.key, - required this.exception, - this.textAlign, - }); + const ErrorText({super.key, required this.exception, this.textAlign}); @override Widget build(BuildContext context) { diff --git a/packages/firebase_ui_auth/lib/src/widgets/internal/oauth_provider_button.dart b/packages/firebase_ui_auth/lib/src/widgets/internal/oauth_provider_button.dart index ee7f618ba..9f5ff48c2 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/internal/oauth_provider_button.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/internal/oauth_provider_button.dart @@ -116,7 +116,7 @@ class OAuthProviderButton extends StatelessWidget { label: variant == OAuthButtonVariant.icon ? '' : provider.style.label ?? - resolveProviderButtonLabel(provider.providerId, labels), + resolveProviderButtonLabel(provider.providerId, labels), auth: auth, ); @@ -124,12 +124,7 @@ class OAuthProviderButton extends StatelessWidget { return button; } - return Column( - children: [ - button, - const _ErrorListener(), - ], - ); + return Column(children: [button, const _ErrorListener()]); }, ); } diff --git a/packages/firebase_ui_auth/lib/src/widgets/internal/subtitle.dart b/packages/firebase_ui_auth/lib/src/widgets/internal/subtitle.dart index eb60a3070..8e3403346 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/internal/subtitle.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/internal/subtitle.dart @@ -10,11 +10,7 @@ class Subtitle extends PlatformWidget { final String text; final FontWeight? fontWeight; - const Subtitle({ - super.key, - required this.text, - this.fontWeight, - }); + const Subtitle({super.key, required this.text, this.fontWeight}); @override Widget buildCupertino(BuildContext context) { @@ -28,10 +24,9 @@ class Subtitle extends PlatformWidget { Widget buildMaterial(BuildContext context) { return Text( text, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith(fontWeight: fontWeight), + style: Theme.of( + context, + ).textTheme.titleMedium!.copyWith(fontWeight: fontWeight), ); } } diff --git a/packages/firebase_ui_auth/lib/src/widgets/internal/title.dart b/packages/firebase_ui_auth/lib/src/widgets/internal/title.dart index 4d52bb058..cc6b142af 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/internal/title.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/internal/title.dart @@ -20,9 +20,6 @@ class Title extends PlatformWidget { @override Widget buildMaterial(BuildContext context) { - return Text( - text, - style: Theme.of(context).textTheme.headlineSmall, - ); + return Text(text, style: Theme.of(context).textTheme.headlineSmall); } } diff --git a/packages/firebase_ui_auth/lib/src/widgets/internal/universal_text_form_field.dart b/packages/firebase_ui_auth/lib/src/widgets/internal/universal_text_form_field.dart index f513b4b91..758592520 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/internal/universal_text_form_field.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/internal/universal_text_form_field.dart @@ -53,9 +53,7 @@ class UniversalTextFormField extends PlatformWidget { padding: const EdgeInsets.only(bottom: 8), decoration: const BoxDecoration( border: Border( - bottom: BorderSide( - color: CupertinoColors.inactiveGray, - ), + bottom: BorderSide(color: CupertinoColors.inactiveGray), ), ), child: CupertinoTextFormFieldRow( diff --git a/packages/firebase_ui_auth/lib/src/widgets/layout_flow_aware_padding.dart b/packages/firebase_ui_auth/lib/src/widgets/layout_flow_aware_padding.dart index db517cf57..3d5b134a0 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/layout_flow_aware_padding.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/layout_flow_aware_padding.dart @@ -41,20 +41,11 @@ class LayoutFlowAwarePadding extends StatelessWidget { if (axis == null) { finalPadding = padding; } else if (axis == Axis.horizontal) { - finalPadding = EdgeInsets.only( - left: padding.left, - right: padding.right, - ); + finalPadding = EdgeInsets.only(left: padding.left, right: padding.right); } else { - finalPadding = EdgeInsets.only( - top: padding.top, - bottom: padding.bottom, - ); + finalPadding = EdgeInsets.only(top: padding.top, bottom: padding.bottom); } - return Padding( - padding: finalPadding, - child: child, - ); + return Padding(padding: finalPadding, child: child); } } diff --git a/packages/firebase_ui_auth/lib/src/widgets/phone_input.dart b/packages/firebase_ui_auth/lib/src/widgets/phone_input.dart index 1a0aef9d3..4929cd68e 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/phone_input.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/phone_input.dart @@ -184,10 +184,7 @@ class PhoneInputState extends State { void _onCountryChanged() { setState(() { - _setCountry( - phoneCode: countryController.text, - updateCountryInput: false, - ); + _setCountry(phoneCode: countryController.text, updateCountryInput: false); }); } @@ -285,9 +282,8 @@ class PhoneInputState extends State { ); }).toList(); }, - onSelected: (selected) => _setCountry( - countryCode: selected.countryCode, - ), + onSelected: (selected) => + _setCountry(countryCode: selected.countryCode), ), const SizedBox(height: 16), Directionality( @@ -300,14 +296,12 @@ class PhoneInputState extends State { width: 90, child: UniversalTextFormField( autofillHints: const [ - AutofillHints.telephoneNumberCountryCode + AutofillHints.telephoneNumberCountryCode, ], controller: countryController, prefix: const Text('+'), placeholder: l.countryCode, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - ], + inputFormatters: [FilteringTextInputFormatter.digitsOnly], keyboardType: TextInputType.phone, validator: NotEmpty('').validate, onSubmitted: (_) { @@ -319,7 +313,7 @@ class PhoneInputState extends State { Expanded( child: UniversalTextFormField( autofillHints: const [ - AutofillHints.telephoneNumberNational + AutofillHints.telephoneNumberNational, ], autofocus: widget.autoFocus, focusNode: numberFocusNode, @@ -330,9 +324,7 @@ class PhoneInputState extends State { PhoneValidator(l.phoneNumberInvalidErrorText), ]), onSubmitted: _onSubmitted, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - ], + inputFormatters: [FilteringTextInputFormatter.digitsOnly], keyboardType: TextInputType.phone, ), ), diff --git a/packages/firebase_ui_auth/lib/src/widgets/reauthenticate_dialog.dart b/packages/firebase_ui_auth/lib/src/widgets/reauthenticate_dialog.dart index 2d118aa0d..d049cd114 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/reauthenticate_dialog.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/reauthenticate_dialog.dart @@ -60,45 +60,44 @@ class ReauthenticateDialog extends StatelessWidget { constraints: const BoxConstraints(maxWidth: 400), child: Dialog( child: Padding( - padding: verticalPadding, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: horizontalPadding, - child: Title(text: l.verifyItsYouText), + padding: verticalPadding, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: horizontalPadding, + child: Title(text: l.verifyItsYouText), + ), + const SizedBox(height: 16), + ConstrainedBox( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.shortestSide / 1.5, ), - const SizedBox(height: 16), - ConstrainedBox( - constraints: BoxConstraints( - maxHeight: MediaQuery.of(context).size.shortestSide / 1.5, - ), - child: Scrollbar( - thumbVisibility: true, - trackVisibility: true, - child: ListView( - shrinkWrap: true, - padding: const EdgeInsets.symmetric(horizontal: 16), - children: [ - reauthenticateView, - const SizedBox(height: 16), - ], - ), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + child: ListView( + shrinkWrap: true, + padding: const EdgeInsets.symmetric(horizontal: 16), + children: [ + reauthenticateView, + const SizedBox(height: 16), + ], ), ), - Padding( - padding: horizontalPadding.copyWith( - top: verticalPadding.top, - ), - child: UniversalButton( - text: l.cancelButtonLabel, - variant: ButtonVariant.text, - onPressed: () => Navigator.of(context).pop(), - ), - ) - ], - )), + ), + Padding( + padding: horizontalPadding.copyWith(top: verticalPadding.top), + child: UniversalButton( + text: l.cancelButtonLabel, + variant: ButtonVariant.text, + onPressed: () => Navigator.of(context).pop(), + ), + ), + ], + ), + ), ), ), ); diff --git a/packages/firebase_ui_auth/lib/src/widgets/sign_out_button.dart b/packages/firebase_ui_auth/lib/src/widgets/sign_out_button.dart index 5e46e9fa2..19386b101 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/sign_out_button.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/sign_out_button.dart @@ -32,10 +32,7 @@ class SignOutButton extends StatelessWidget { return UniversalButton( text: l.signOutButtonText, - onPressed: () => FirebaseUIAuth.signOut( - context: context, - auth: auth, - ), + onPressed: () => FirebaseUIAuth.signOut(context: context, auth: auth), cupertinoIcon: CupertinoIcons.arrow_right_circle, materialIcon: Icons.logout, variant: variant, diff --git a/packages/firebase_ui_auth/lib/src/widgets/sms_code_input.dart b/packages/firebase_ui_auth/lib/src/widgets/sms_code_input.dart index 36e81b85a..5720f2b7e 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/sms_code_input.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/sms_code_input.dart @@ -37,10 +37,7 @@ class _NumberSlotDecoration extends Decoration { final InputBorder inputBorder; final Color color; - const _NumberSlotDecoration({ - required this.inputBorder, - required this.color, - }); + const _NumberSlotDecoration({required this.inputBorder, required this.color}); @override BoxPainter createBoxPainter([VoidCallback? onChanged]) { @@ -113,15 +110,9 @@ class _NumberSlotState extends State<_NumberSlot> child: AnimatedBuilder( animation: controller, builder: (context, child) { - return Transform.scale( - scale: controller.value, - child: child, - ); + return Transform.scale(scale: controller.value, child: child); }, - child: Text( - widget.number, - style: const TextStyle(fontSize: 24), - ), + child: Text(widget.number, style: const TextStyle(fontSize: 24)), ), ), ); @@ -251,8 +242,9 @@ class SMSCodeInputState extends State { autofocus: true, focusNode: focusNode, controller: controller, - keyboardType: - const TextInputType.numberWithOptions(decimal: true), + keyboardType: const TextInputType.numberWithOptions( + decimal: true, + ), inputFormatters: [FilteringTextInputFormatter.digitsOnly], onSubmitted: (v) { if (v == null) return; diff --git a/packages/firebase_ui_auth/pubspec.yaml b/packages/firebase_ui_auth/pubspec.yaml index 8dcfbba49..351c07944 100644 --- a/packages/firebase_ui_auth/pubspec.yaml +++ b/packages/firebase_ui_auth/pubspec.yaml @@ -7,7 +7,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: app_links: ^6.4.0 diff --git a/packages/firebase_ui_auth/test/flows/email_auth_flow_test.dart b/packages/firebase_ui_auth/test/flows/email_auth_flow_test.dart index a61f09e47..6fc84a90b 100644 --- a/packages/firebase_ui_auth/test/flows/email_auth_flow_test.dart +++ b/packages/firebase_ui_auth/test/flows/email_auth_flow_test.dart @@ -145,11 +145,7 @@ void main() { ctrl.setEmailAndPassword('email', 'password'); final result = verify( - provider.authenticate( - captureAny, - captureAny, - captureAny, - ), + provider.authenticate(captureAny, captureAny, captureAny), )..called(1); expect(result.captured[0], 'email'); @@ -178,10 +174,8 @@ void main() { builder: (context, state, ctrl, _) { return ElevatedButton( child: const Text('Sign in'), - onPressed: () => ctrl.setEmailAndPassword( - 'email', - 'password', - ), + onPressed: () => + ctrl.setEmailAndPassword('email', 'password'), ); }, ), @@ -216,10 +210,8 @@ void main() { builder: (context, state, ctrl, _) { return ElevatedButton( child: const Text('Sign in'), - onPressed: () => ctrl.setEmailAndPassword( - 'email', - 'password', - ), + onPressed: () => + ctrl.setEmailAndPassword('email', 'password'), ); }, ), @@ -249,31 +241,18 @@ class MockAuthListener extends Mock implements EmailAuthListener { @override void onCredentialReceived(AuthCredential? credential) { super.noSuchMethod( - Invocation.method( - #onBeforeCredentialLinked, - [credential], - ), + Invocation.method(#onBeforeCredentialLinked, [credential]), ); } @override void onCredentialLinked(AuthCredential? credential) { - super.noSuchMethod( - Invocation.method( - #onCredentialLinked, - [credential], - ), - ); + super.noSuchMethod(Invocation.method(#onCredentialLinked, [credential])); } @override void onSignedIn(UserCredential? credential) { - super.noSuchMethod( - Invocation.method( - #onSignedIn, - [credential], - ), - ); + super.noSuchMethod(Invocation.method(#onSignedIn, [credential])); } @override diff --git a/packages/firebase_ui_auth/test/flows/email_link_flow_test.dart b/packages/firebase_ui_auth/test/flows/email_link_flow_test.dart index 517c441e7..a39c24e25 100644 --- a/packages/firebase_ui_auth/test/flows/email_link_flow_test.dart +++ b/packages/firebase_ui_auth/test/flows/email_link_flow_test.dart @@ -34,10 +34,7 @@ void main() { appLinks: appLinks, ); - flow = EmailLinkFlow( - provider: provider, - auth: auth, - ); + flow = EmailLinkFlow(provider: provider, auth: auth); ctrl = flow; }); @@ -350,22 +347,16 @@ class MockListener extends Mock implements EmailLinkAuthListener { @override void onBeforeLinkSent(String? email) { - super.noSuchMethod( - Invocation.method(#onBeforeLinkSent, [email]), - ); + super.noSuchMethod(Invocation.method(#onBeforeLinkSent, [email])); } @override void onLinkSent(String? email) { - super.noSuchMethod( - Invocation.method(#onLinkSent, [email]), - ); + super.noSuchMethod(Invocation.method(#onLinkSent, [email])); } @override void onError(Object? error) { - super.noSuchMethod( - Invocation.method(#onError, [error]), - ); + super.noSuchMethod(Invocation.method(#onError, [error])); } } diff --git a/packages/firebase_ui_auth/test/flows/phone_auth_flow_test.dart b/packages/firebase_ui_auth/test/flows/phone_auth_flow_test.dart index b4897dfe0..85f01b17f 100644 --- a/packages/firebase_ui_auth/test/flows/phone_auth_flow_test.dart +++ b/packages/firebase_ui_auth/test/flows/phone_auth_flow_test.dart @@ -275,9 +275,7 @@ void main() { verificationId: 'verificationId', ); - final invocation = verify( - listener.onCredentialReceived(captureAny), - ); + final invocation = verify(listener.onCredentialReceived(captureAny)); expect(invocation.callCount, 1); expect(invocation.captured.first, isA()); @@ -288,31 +286,28 @@ void main() { expect(cred.verificationId, 'verificationId'); }); - test( - 'calls onCredentialLinked if credential linking succeded', - () async { - final user = MockUser(); - auth.user = user; + test('calls onCredentialLinked if credential linking succeded', () async { + final user = MockUser(); + auth.user = user; - provider.verifySMSCode( - action: AuthAction.link, - code: '123456', - verificationId: 'verificationId', - ); + provider.verifySMSCode( + action: AuthAction.link, + code: '123456', + verificationId: 'verificationId', + ); - await untilCalled(user.linkWithCredential(any)); + await untilCalled(user.linkWithCredential(any)); - final invocation = verify(listener.onCredentialLinked(captureAny)); + final invocation = verify(listener.onCredentialLinked(captureAny)); - expect(invocation.callCount, 1); - expect(invocation.captured.first, isA()); + expect(invocation.callCount, 1); + expect(invocation.captured.first, isA()); - final cred = invocation.captured.first as fba.PhoneAuthCredential; + final cred = invocation.captured.first as fba.PhoneAuthCredential; - expect(cred.smsCode, '123456'); - expect(cred.verificationId, 'verificationId'); - }, - ); + expect(cred.smsCode, '123456'); + expect(cred.verificationId, 'verificationId'); + }); }); group('PhoneAuthController', () { @@ -371,17 +366,13 @@ class MockProvider extends Mock implements PhoneAuthProvider { fba.PhoneMultiFactorInfo? hint, }) { super.noSuchMethod( - Invocation.method( - #sendVerificationCode, - null, - { - #phoneNumber: phoneNumber, - #action: action, - #forceResendingToken: forceResendingToken, - #multiFactorSession: multiFactorSession, - #hint: hint, - }, - ), + Invocation.method(#sendVerificationCode, null, { + #phoneNumber: phoneNumber, + #action: action, + #forceResendingToken: forceResendingToken, + #multiFactorSession: multiFactorSession, + #hint: hint, + }), ); } @@ -393,16 +384,12 @@ class MockProvider extends Mock implements PhoneAuthProvider { fba.ConfirmationResult? confirmationResult, }) { super.noSuchMethod( - Invocation.method( - #verifySMSCode, - null, - { - #action: action, - #code: code, - #verificationId: verificationId, - #confirmationResult: confirmationResult, - }, - ), + Invocation.method(#verifySMSCode, null, { + #action: action, + #code: code, + #verificationId: verificationId, + #confirmationResult: confirmationResult, + }), ); } } @@ -415,73 +402,41 @@ class MockListener extends Mock implements PhoneAuthListener { @override void onCodeSent(String? verificationId, [int? forceResendToken]) { super.noSuchMethod( - Invocation.method( - #onCodeSent, - [ - verificationId, - forceResendToken, - ], - ), + Invocation.method(#onCodeSent, [verificationId, forceResendToken]), ); } @override void onSMSCodeRequested(String? phoneNumber) { - super.noSuchMethod( - Invocation.method( - #onSMSCodeRequested, - [phoneNumber], - ), - ); + super.noSuchMethod(Invocation.method(#onSMSCodeRequested, [phoneNumber])); } @override void onCredentialLinked(fba.AuthCredential? credential) { - super.noSuchMethod( - Invocation.method( - #onCredentialLinked, - [credential], - ), - ); + super.noSuchMethod(Invocation.method(#onCredentialLinked, [credential])); } @override void onVerificationCompleted(fba.PhoneAuthCredential? credential) { super.noSuchMethod( - Invocation.method( - #onVerificationCompleted, - [credential], - ), + Invocation.method(#onVerificationCompleted, [credential]), ); } @override void onError(Object? error) { - super.noSuchMethod( - Invocation.method( - #onError, - [error], - ), - ); + super.noSuchMethod(Invocation.method(#onError, [error])); } @override void onCredentialReceived(fba.AuthCredential? credential) { super.noSuchMethod( - Invocation.method( - #onBeforeCredentialLinked, - [credential], - ), + Invocation.method(#onBeforeCredentialLinked, [credential]), ); } @override void onSignedIn(fba.UserCredential? credential) { - super.noSuchMethod( - Invocation.method( - #onSignedIn, - [credential], - ), - ); + super.noSuchMethod(Invocation.method(#onSignedIn, [credential])); } } diff --git a/packages/firebase_ui_auth/test/screens/register_screen_test.dart b/packages/firebase_ui_auth/test/screens/register_screen_test.dart index 2f9463c73..369c1cb4d 100644 --- a/packages/firebase_ui_auth/test/screens/register_screen_test.dart +++ b/packages/firebase_ui_auth/test/screens/register_screen_test.dart @@ -14,21 +14,20 @@ void main() { setFirebaseUiIsTestMode(true); }); - testWidgets( - "doesn't have password visibility toggle by default", - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: RegisterScreen( - auth: MockAuth(), - providers: [EmailAuthProvider()], - ), + testWidgets("doesn't have password visibility toggle by default", ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp( + child: RegisterScreen( + auth: MockAuth(), + providers: [EmailAuthProvider()], ), - ); + ), + ); - expect(find.byIcon(Icons.visibility), findsNothing); - }, - ); + expect(find.byIcon(Icons.visibility), findsNothing); + }); testWidgets('allows to add password visibility toggle', (tester) async { await tester.pumpWidget( diff --git a/packages/firebase_ui_auth/test/screens/sign_in_screen_test.dart b/packages/firebase_ui_auth/test/screens/sign_in_screen_test.dart index 0030236e8..5966a8f0b 100644 --- a/packages/firebase_ui_auth/test/screens/sign_in_screen_test.dart +++ b/packages/firebase_ui_auth/test/screens/sign_in_screen_test.dart @@ -14,21 +14,20 @@ void main() { setFirebaseUiIsTestMode(true); }); - testWidgets( - "doesn't have password visibility toggle by default", - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: SignInScreen( - auth: MockAuth(), - providers: [EmailAuthProvider()], - ), + testWidgets("doesn't have password visibility toggle by default", ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp( + child: SignInScreen( + auth: MockAuth(), + providers: [EmailAuthProvider()], ), - ); + ), + ); - expect(find.byIcon(Icons.visibility), findsNothing); - }, - ); + expect(find.byIcon(Icons.visibility), findsNothing); + }); testWidgets('allows to add password visibility toggle', (tester) async { await tester.pumpWidget( diff --git a/packages/firebase_ui_auth/test/test_utils.dart b/packages/firebase_ui_auth/test/test_utils.dart index 20059ffe0..df0c7164c 100644 --- a/packages/firebase_ui_auth/test/test_utils.dart +++ b/packages/firebase_ui_auth/test/test_utils.dart @@ -16,11 +16,7 @@ class TestMaterialApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - body: child, - ), - ); + return MaterialApp(home: Scaffold(body: child)); } } @@ -44,10 +40,7 @@ class MockUser extends Mock implements fba.User { fba.AuthCredential? credential, ) async { return super.noSuchMethod( - Invocation.method( - #linkWithCredential, - [credential], - ), + Invocation.method(#linkWithCredential, [credential]), returnValue: MockCredential(), returnValueForMissingStub: MockCredential(), ); @@ -120,10 +113,7 @@ class MockAuth extends Mock implements fba.FirebaseAuth { fba.AuthCredential? credential, ) async { return super.noSuchMethod( - Invocation.method( - #signInWithCredential, - [credential], - ), + Invocation.method(#signInWithCredential, [credential]), returnValue: MockCredential(), returnValueForMissingStub: MockCredential(), ); @@ -150,14 +140,10 @@ class MockAuth extends Mock implements fba.FirebaseAuth { required fba.ActionCodeSettings? actionCodeSettings, }) async { return super.noSuchMethod( - Invocation.method( - #sendSignInLinkToEmail, - null, - { - #email: email, - #actionCodeSettings: actionCodeSettings, - }, - ), + Invocation.method(#sendSignInLinkToEmail, null, { + #email: email, + #actionCodeSettings: actionCodeSettings, + }), returnValueForMissingStub: null, ); } @@ -165,10 +151,7 @@ class MockAuth extends Mock implements fba.FirebaseAuth { @override bool isSignInWithEmailLink(String? emailLink) { return super.noSuchMethod( - Invocation.method( - #isSignInWithEmailLink, - [emailLink], - ), + Invocation.method(#isSignInWithEmailLink, [emailLink]), returnValue: true, returnValueForMissingStub: true, ); @@ -180,14 +163,10 @@ class MockAuth extends Mock implements fba.FirebaseAuth { required String? emailLink, }) async { return super.noSuchMethod( - Invocation.method( - #signInWithEmailLink, - null, - { - #email: email, - #emailLink: emailLink, - }, - ), + Invocation.method(#signInWithEmailLink, null, { + #email: email, + #emailLink: emailLink, + }), returnValue: MockCredential(), returnValueForMissingStub: MockCredential(), ); @@ -207,20 +186,16 @@ class MockAuth extends Mock implements fba.FirebaseAuth { fba.MultiFactorSession? multiFactorSession, }) async { super.noSuchMethod( - Invocation.method( - #verifyPhoneNumber, - null, - { - #phoneNumber: phoneNumber, - #verificationCompleted: verificationCompleted, - #verificationFailed: verificationFailed, - #codeSent: codeSent, - #codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, - #autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, - #timeout: timeout, - #forceResendingToken: forceResendingToken, - }, - ), + Invocation.method(#verifyPhoneNumber, null, { + #phoneNumber: phoneNumber, + #verificationCompleted: verificationCompleted, + #verificationFailed: verificationFailed, + #codeSent: codeSent, + #codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, + #autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, + #timeout: timeout, + #forceResendingToken: forceResendingToken, + }), ); } } diff --git a/packages/firebase_ui_auth/test/views/email_link_sign_in_view_test.dart b/packages/firebase_ui_auth/test/views/email_link_sign_in_view_test.dart index 04c844fd4..4bafc77da 100644 --- a/packages/firebase_ui_auth/test/views/email_link_sign_in_view_test.dart +++ b/packages/firebase_ui_auth/test/views/email_link_sign_in_view_test.dart @@ -31,12 +31,11 @@ void main() { /// If EmailLinkSignInView is the root view, there should be /// no option to go back. testWidgets('no go back option if root view', (tester) async { - await tester.pumpWidget(TestMaterialApp( - child: EmailLinkSignInView( - provider: emailLinkProvider, - auth: auth, + await tester.pumpWidget( + TestMaterialApp( + child: EmailLinkSignInView(provider: emailLinkProvider, auth: auth), ), - )); + ); final button = find.text(labels.goBackButtonLabel); expect(button, findsNothing); @@ -55,7 +54,9 @@ void main() { MaterialPageRoute( builder: (context) => Scaffold( body: EmailLinkSignInView( - provider: emailLinkProvider, auth: auth), + provider: emailLinkProvider, + auth: auth, + ), ), ), ), diff --git a/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart b/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart index aa23768ca..fb9f921b3 100644 --- a/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart +++ b/packages/firebase_ui_auth/test/views/forgot_password_view_test.dart @@ -18,14 +18,10 @@ class MockFirebaseAuth extends Mock implements fba.FirebaseAuth { fba.ActionCodeSettings? actionCodeSettings, }) { return super.noSuchMethod( - Invocation.method( - #sendPasswordResetEmail, - [], - { - #email: email, - #actionCodeSettings: actionCodeSettings, - }, - ), + Invocation.method(#sendPasswordResetEmail, [], { + #email: email, + #actionCodeSettings: actionCodeSettings, + }), returnValue: Future.value(), returnValueForMissingStub: Future.value(), ); @@ -40,9 +36,7 @@ void main() { setUpAll(() { auth = MockFirebaseAuth(); - widget = TestMaterialApp( - child: ForgotPasswordView(auth: auth), - ); + widget = TestMaterialApp(child: ForgotPasswordView(auth: auth)); when(auth.sendPasswordResetEmail(email: 'invalid@email')).thenThrow( fba.FirebaseAuthException( @@ -51,13 +45,13 @@ void main() { ), ); - when(auth.sendPasswordResetEmail(email: 'valid@email.com')).thenAnswer( - (_) => Future.value(), - ); + when( + auth.sendPasswordResetEmail(email: 'valid@email.com'), + ).thenAnswer((_) => Future.value()); - when(auth.sendPasswordResetEmail(email: 'delay@email.com')).thenAnswer( - (_) => Future.delayed(const Duration(milliseconds: 200)), - ); + when( + auth.sendPasswordResetEmail(email: 'delay@email.com'), + ).thenAnswer((_) => Future.delayed(const Duration(milliseconds: 200))); }); testWidgets('shows error if sendPasswordResetEmail failed', (tester) async { diff --git a/packages/firebase_ui_auth/test/views/login_view_test.dart b/packages/firebase_ui_auth/test/views/login_view_test.dart index 493c1eb37..aff66bc42 100644 --- a/packages/firebase_ui_auth/test/views/login_view_test.dart +++ b/packages/firebase_ui_auth/test/views/login_view_test.dart @@ -12,44 +12,43 @@ import '../test_utils.dart'; void main() { group("$LoginView", () { - testWidgets( - 'rebuilds the footer when the $AuthAction changes', - (tester) async { - const signInKey = ValueKey("Sign in"); - const registerKey = ValueKey("Register"); + testWidgets('rebuilds the footer when the $AuthAction changes', ( + tester, + ) async { + const signInKey = ValueKey("Sign in"); + const registerKey = ValueKey("Register"); - const widgetSignIn = SizedBox(key: signInKey); - const widgetRegister = SizedBox(key: registerKey); + const widgetSignIn = SizedBox(key: signInKey); + const widgetRegister = SizedBox(key: registerKey); - final view = TestMaterialApp( - child: LoginView( - providers: [EmailAuthProvider()], - auth: MockAuth(), - action: AuthAction.signIn, - showAuthActionSwitch: true, - footerBuilder: (context, action) { - switch (action) { - case AuthAction.signIn: - return widgetSignIn; - case AuthAction.signUp: - return widgetRegister; - default: - return const SizedBox(); - } - }, - ), - ); - await tester.pumpWidget(view); + final view = TestMaterialApp( + child: LoginView( + providers: [EmailAuthProvider()], + auth: MockAuth(), + action: AuthAction.signIn, + showAuthActionSwitch: true, + footerBuilder: (context, action) { + switch (action) { + case AuthAction.signIn: + return widgetSignIn; + case AuthAction.signUp: + return widgetRegister; + default: + return const SizedBox(); + } + }, + ), + ); + await tester.pumpWidget(view); - expect(find.byKey(signInKey), findsOneWidget); - expect(find.byKey(registerKey), findsNothing); + expect(find.byKey(signInKey), findsOneWidget); + expect(find.byKey(registerKey), findsNothing); - await _tapOnRegisterActionText(tester); + await _tapOnRegisterActionText(tester); - expect(find.byKey(signInKey), findsNothing); - expect(find.byKey(registerKey), findsOneWidget); - }, - ); + expect(find.byKey(signInKey), findsNothing); + expect(find.byKey(registerKey), findsOneWidget); + }); }); } @@ -59,15 +58,17 @@ void main() { /// for a particular TextSpan. /// See https://stackoverflow.com/a/60247474/19586032 for more details. Future _tapOnRegisterActionText(WidgetTester tester) async { - final actionSwitchRichText = find - .byWidgetPredicate( - (widget) => - widget is RichText && - widget.text.toPlainText().contains("Register"), - ) - .evaluate() - .first - .renderObject! as RenderParagraph; + final actionSwitchRichText = + find + .byWidgetPredicate( + (widget) => + widget is RichText && + widget.text.toPlainText().contains("Register"), + ) + .evaluate() + .first + .renderObject! + as RenderParagraph; actionSwitchRichText.text.visitChildren((InlineSpan span) { if (span is! TextSpan) return true; diff --git a/packages/firebase_ui_auth/test/widgets/dialogs_test.dart b/packages/firebase_ui_auth/test/widgets/dialogs_test.dart index a9d6401ee..97bca3713 100644 --- a/packages/firebase_ui_auth/test/widgets/dialogs_test.dart +++ b/packages/firebase_ui_auth/test/widgets/dialogs_test.dart @@ -9,10 +9,12 @@ import '../test_utils.dart'; void main() { final auth = MockAuth(); - auth.user = MockUser(providerData: [ - MockUserInfo(providerId: 'email'), - MockUserInfo(providerId: 'phone'), - ]); + auth.user = MockUser( + providerData: [ + MockUserInfo(providerId: 'email'), + MockUserInfo(providerId: 'phone'), + ], + ); group('$ReauthenticateDialog', () { testWidgets('has capitalized Cancel label', (tester) async { @@ -20,10 +22,7 @@ void main() { TestMaterialApp( child: ReauthenticateDialog( auth: auth, - providers: [ - EmailAuthProvider(), - PhoneAuthProvider(), - ], + providers: [EmailAuthProvider(), PhoneAuthProvider()], ), ), ); diff --git a/packages/firebase_ui_auth/test/widgets/email_form_test.dart b/packages/firebase_ui_auth/test/widgets/email_form_test.dart index 112004222..cb0449613 100644 --- a/packages/firebase_ui_auth/test/widgets/email_form_test.dart +++ b/packages/firebase_ui_auth/test/widgets/email_form_test.dart @@ -23,10 +23,7 @@ void main() { setUp(() { widget = TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - action: AuthAction.signIn, - ), + child: EmailForm(auth: MockAuth(), action: AuthAction.signIn), ); }); @@ -41,34 +38,51 @@ void main() { await tester.pumpWidget(widget); final button = find.byType(TextButton); - expect( - button, - findsOneWidget, + expect(button, findsOneWidget); + }); + + testWidgets('respects EmailFormStyle passed to FirebaseUITheme', ( + tester, + ) async { + await tester.pumpWidget( + FirebaseUITheme( + styles: const { + EmailFormStyle(signInButtonVariant: ButtonVariant.filled), + }, + child: widget, + ), ); + + final button = find.byType(ElevatedButton); + expect(button, findsOneWidget); }); - testWidgets( - 'respects EmailFormStyle passed to FirebaseUITheme', - (tester) async { - await tester.pumpWidget( - FirebaseUITheme( + testWidgets('respects EmailFormStyle passed via property', (tester) async { + await tester.pumpWidget( + widget = TestMaterialApp( + child: EmailForm( + auth: MockAuth(), + action: AuthAction.signIn, + style: const EmailFormStyle( + signInButtonVariant: ButtonVariant.filled, + ), + ), + ), + ); + + final button = find.byType(ElevatedButton); + expect(button, findsOneWidget); + }); + + testWidgets('EmailFormStyle passed via property is higher priority', ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp( + child: FirebaseUITheme( styles: const { - EmailFormStyle(signInButtonVariant: ButtonVariant.filled) + EmailFormStyle(signInButtonVariant: ButtonVariant.text), }, - child: widget, - ), - ); - - final button = find.byType(ElevatedButton); - expect(button, findsOneWidget); - }, - ); - - testWidgets( - 'respects EmailFormStyle passed via property', - (tester) async { - await tester.pumpWidget( - widget = TestMaterialApp( child: EmailForm( auth: MockAuth(), action: AuthAction.signIn, @@ -77,37 +91,12 @@ void main() { ), ), ), - ); - - final button = find.byType(ElevatedButton); - expect(button, findsOneWidget); - }, - ); - - testWidgets( - 'EmailFormStyle passed via property is higher priority', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: FirebaseUITheme( - styles: const { - EmailFormStyle(signInButtonVariant: ButtonVariant.text) - }, - child: EmailForm( - auth: MockAuth(), - action: AuthAction.signIn, - style: const EmailFormStyle( - signInButtonVariant: ButtonVariant.filled, - ), - ), - ), - ), - ); + ), + ); - final button = find.byType(ElevatedButton); - expect(button, findsOneWidget); - }, - ); + final button = find.byType(ElevatedButton); + expect(button, findsOneWidget); + }); testWidgets('has password visibility toggle', (tester) async { await tester.pumpWidget( @@ -159,11 +148,7 @@ void main() { testWidgets('validates email', (tester) async { await tester.pumpWidget( - TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - ), - ), + TestMaterialApp(child: EmailForm(auth: MockAuth())), ); final inputs = find.byType(TextFormField); @@ -178,11 +163,7 @@ void main() { testWidgets('requires password', (tester) async { await tester.pumpWidget( - TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - ), - ), + TestMaterialApp(child: EmailForm(auth: MockAuth())), ); final inputs = find.byType(TextFormField); @@ -198,86 +179,72 @@ void main() { expect(find.text(labels.passwordIsRequiredErrorText), findsOneWidget); }); - testWidgets( - 'shows password confirmation if action is sign up', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - action: AuthAction.signUp, - ), - ), - ); - - final inputs = find.byType(TextFormField); - expect(inputs, findsNWidgets(3)); - }, - ); - - testWidgets( - 'requires password confirmation', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - action: AuthAction.signUp, - ), - ), - ); + testWidgets('shows password confirmation if action is sign up', ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp( + child: EmailForm(auth: MockAuth(), action: AuthAction.signUp), + ), + ); - final inputs = find.byType(TextFormField); + final inputs = find.byType(TextFormField); + expect(inputs, findsNWidgets(3)); + }); - await tester.enterText(inputs.at(0), 'test@test.com'); - await tester.testTextInput.receiveAction(TextInputAction.done); + testWidgets('requires password confirmation', (tester) async { + await tester.pumpWidget( + TestMaterialApp( + child: EmailForm(auth: MockAuth(), action: AuthAction.signUp), + ), + ); - await tester.enterText(inputs.at(1), 'password'); - await tester.testTextInput.receiveAction(TextInputAction.done); + final inputs = find.byType(TextFormField); - await tester.enterText(inputs.at(2), ''); - await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.enterText(inputs.at(0), 'test@test.com'); + await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); + await tester.enterText(inputs.at(1), 'password'); + await tester.testTextInput.receiveAction(TextInputAction.done); - expect( - find.text(labels.confirmPasswordIsRequiredErrorText), - findsOneWidget, - ); - }, - ); + await tester.enterText(inputs.at(2), ''); + await tester.testTextInput.receiveAction(TextInputAction.done); - testWidgets( - 'verifies that password confirmation matches password', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - child: EmailForm( - auth: MockAuth(), - action: AuthAction.signUp, - ), - ), - ); + await tester.pumpAndSettle(); + + expect( + find.text(labels.confirmPasswordIsRequiredErrorText), + findsOneWidget, + ); + }); + + testWidgets('verifies that password confirmation matches password', ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp( + child: EmailForm(auth: MockAuth(), action: AuthAction.signUp), + ), + ); - final inputs = find.byType(TextFormField); + final inputs = find.byType(TextFormField); - await tester.enterText(inputs.at(0), 'test@test.com'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pump(); + await tester.enterText(inputs.at(0), 'test@test.com'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); - await tester.enterText(inputs.at(1), 'password'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pump(); + await tester.enterText(inputs.at(1), 'password'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); - await tester.enterText(inputs.at(2), 'psasword'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); + await tester.enterText(inputs.at(2), 'psasword'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); - expect( - find.text(labels.confirmPasswordDoesNotMatchErrorText), - findsOneWidget, - ); - }, - ); + expect( + find.text(labels.confirmPasswordDoesNotMatchErrorText), + findsOneWidget, + ); + }); }); } diff --git a/packages/firebase_ui_auth/test/widgets/error_text_test.dart b/packages/firebase_ui_auth/test/widgets/error_text_test.dart index 78e0df2a3..6c096b9bc 100644 --- a/packages/firebase_ui_auth/test/widgets/error_text_test.dart +++ b/packages/firebase_ui_auth/test/widgets/error_text_test.dart @@ -23,9 +23,7 @@ void main() { await tester.pumpWidget( MaterialApp( home: ErrorText(exception: exception), - localizationsDelegates: const [ - FirebaseUILocalizations.delegate, - ], + localizationsDelegates: const [FirebaseUILocalizations.delegate], ), ); expect( @@ -48,16 +46,11 @@ void main() { await tester.pumpWidget( MaterialApp( home: ErrorText(exception: exception), - localizationsDelegates: const [ - FirebaseUILocalizations.delegate, - ], + localizationsDelegates: const [FirebaseUILocalizations.delegate], ), ); - expect( - find.text('Custom error text'), - findsOneWidget, - ); + expect(find.text('Custom error text'), findsOneWidget); }); }); } diff --git a/packages/firebase_ui_auth/test/widgets/phone_input_test.dart b/packages/firebase_ui_auth/test/widgets/phone_input_test.dart index fdaa4cd6c..946bd889a 100644 --- a/packages/firebase_ui_auth/test/widgets/phone_input_test.dart +++ b/packages/firebase_ui_auth/test/widgets/phone_input_test.dart @@ -11,28 +11,23 @@ void main() { testWidgets('shows default country and country code', (tester) async { await tester.pumpWidget( const MaterialApp( - home: Scaffold( - body: PhoneInput(initialCountryCode: 'US'), - ), + home: Scaffold(body: PhoneInput(initialCountryCode: 'US')), ), ); expect(find.text('United States'), findsOneWidget); }); - testWidgets( - 'prompts to select a country if initialCountryCode is null', - (tester) async { - await tester.pumpWidget( - const MaterialApp( - home: Scaffold( - body: PhoneInput(initialCountryCode: null), - ), - ), - ); + testWidgets('prompts to select a country if initialCountryCode is null', ( + tester, + ) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold(body: PhoneInput(initialCountryCode: null)), + ), + ); - expect(find.text('Choose a country'), findsOneWidget); - }, - ); + expect(find.text('Choose a country'), findsOneWidget); + }); }); } diff --git a/packages/firebase_ui_database/example/pubspec.yaml b/packages/firebase_ui_database/example/pubspec.yaml index 9c07b2ed2..49e4cbe0c 100644 --- a/packages/firebase_ui_database/example/pubspec.yaml +++ b/packages/firebase_ui_database/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_database/lib/src/query_builder.dart b/packages/firebase_ui_database/lib/src/query_builder.dart index 9034eb05e..02b0c2ef6 100644 --- a/packages/firebase_ui_database/lib/src/query_builder.dart +++ b/packages/firebase_ui_database/lib/src/query_builder.dart @@ -11,11 +11,12 @@ import 'package:firebase_database/firebase_database.dart'; /// A function that builds a widget from a [FirebaseQueryBuilderSnapshot] /// /// See also [FirebaseDatabaseQueryBuilder]. -typedef FirebaseQueryBuilderSnapshotBuilder = Widget Function( - BuildContext context, - FirebaseQueryBuilderSnapshot snapshot, - Widget? child, -); +typedef FirebaseQueryBuilderSnapshotBuilder = + Widget Function( + BuildContext context, + FirebaseQueryBuilderSnapshot snapshot, + Widget? child, + ); /// {@template firebase_ui.firebase_database_query_builder} /// Listens to a query and paginates the result in a way that is compatible with @@ -163,8 +164,8 @@ class _FirestoreQueryBuilderState extends State { // "build" – most commonly ListView's itemBuilder Future.microtask(() => setState(() {})); - final expectedDocsCount = (_pageCount + 1) * widget.pageSize - + final expectedDocsCount = + (_pageCount + 1) * widget.pageSize /// The "+1" is used to voluntarily fetch one extra item, /// used to determine whether there is a next page or not. /// This extra item will not be rendered. @@ -363,20 +364,15 @@ class _Sentinel { } /// A type representing the function passed to [FirebaseDatabaseListView] for its `itemBuilder`. -typedef FirebaseItemBuilder = Widget Function( - BuildContext context, - DataSnapshot doc, -); +typedef FirebaseItemBuilder = + Widget Function(BuildContext context, DataSnapshot doc); /// A type representing the function passed to [FirebaseDatabaseListView] for its `loadingBuilder`. typedef FirebaseLoadingBuilder = Widget Function(BuildContext context); /// A type representing the function passed to [FirebaseDatabaseListView] for its `errorBuilder`. -typedef FirebaseErrorBuilder = Widget Function( - BuildContext context, - Object error, - StackTrace stackTrace, -); +typedef FirebaseErrorBuilder = + Widget Function(BuildContext context, Object error, StackTrace stackTrace); /// {@template firebase_ui.firebase_database_list_view} /// A [ListView.builder] that obtains its items from a Firestore query. @@ -435,49 +431,49 @@ class FirebaseDatabaseListView extends FirebaseDatabaseQueryBuilder { String? restorationId, Clip clipBehavior = Clip.hardEdge, }) : super( - builder: (context, snapshot, _) { - if (snapshot.isFetching) { - return loadingBuilder?.call(context) ?? - const Center(child: CircularProgressIndicator.adaptive()); - } - - if (snapshot.hasError && errorBuilder != null) { - return errorBuilder( - context, - snapshot.error!, - snapshot.stackTrace!, - ); - } - - return ListView.builder( - itemCount: snapshot.docs.length, - itemBuilder: (context, index) { - final isLastItem = index + 1 == snapshot.docs.length; - if (isLastItem && snapshot.hasMore) snapshot.fetchMore(); - - final doc = snapshot.docs[index]; - return itemBuilder(context, doc); - }, - scrollDirection: scrollDirection, - reverse: reverse, - controller: controller, - primary: primary, - physics: physics, - shrinkWrap: shrinkWrap, - padding: padding, - itemExtent: itemExtent, - prototypeItem: prototypeItem, - addAutomaticKeepAlives: addAutomaticKeepAlives, - addRepaintBoundaries: addRepaintBoundaries, - addSemanticIndexes: addSemanticIndexes, - // ignore: deprecated_member_use - cacheExtent: cacheExtent, - semanticChildCount: semanticChildCount, - dragStartBehavior: dragStartBehavior, - keyboardDismissBehavior: keyboardDismissBehavior, - restorationId: restorationId, - clipBehavior: clipBehavior, - ); - }, - ); + builder: (context, snapshot, _) { + if (snapshot.isFetching) { + return loadingBuilder?.call(context) ?? + const Center(child: CircularProgressIndicator.adaptive()); + } + + if (snapshot.hasError && errorBuilder != null) { + return errorBuilder( + context, + snapshot.error!, + snapshot.stackTrace!, + ); + } + + return ListView.builder( + itemCount: snapshot.docs.length, + itemBuilder: (context, index) { + final isLastItem = index + 1 == snapshot.docs.length; + if (isLastItem && snapshot.hasMore) snapshot.fetchMore(); + + final doc = snapshot.docs[index]; + return itemBuilder(context, doc); + }, + scrollDirection: scrollDirection, + reverse: reverse, + controller: controller, + primary: primary, + physics: physics, + shrinkWrap: shrinkWrap, + padding: padding, + itemExtent: itemExtent, + prototypeItem: prototypeItem, + addAutomaticKeepAlives: addAutomaticKeepAlives, + addRepaintBoundaries: addRepaintBoundaries, + addSemanticIndexes: addSemanticIndexes, + // ignore: deprecated_member_use + cacheExtent: cacheExtent, + semanticChildCount: semanticChildCount, + dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, + restorationId: restorationId, + clipBehavior: clipBehavior, + ); + }, + ); } diff --git a/packages/firebase_ui_database/lib/src/table_builder.dart b/packages/firebase_ui_database/lib/src/table_builder.dart index 42b61d55c..933c82efb 100644 --- a/packages/firebase_ui_database/lib/src/table_builder.dart +++ b/packages/firebase_ui_database/lib/src/table_builder.dart @@ -63,12 +63,12 @@ class FirebaseDatabaseDataTable extends StatefulWidget { this.dragStartBehavior = DragStartBehavior.start, this.arrowHeadColor, this.checkboxHorizontalMargin, - }) : assert( - columnLabels is LinkedHashMap, - 'only LinkedHashMap are supported as header', - ), // using an assert instead of a type because `{}` types as `Map` but is an instance of `LinkedHashMap` - dataRowMinHeight = dataRowMinHeight ?? kMinInteractiveDimension, - dataRowMaxHeight = dataRowMaxHeight ?? kMinInteractiveDimension; + }) : assert( + columnLabels is LinkedHashMap, + 'only LinkedHashMap are supported as header', + ), // using an assert instead of a type because `{}` types as `Map` but is an instance of `LinkedHashMap` + dataRowMinHeight = dataRowMinHeight ?? kMinInteractiveDimension, + dataRowMaxHeight = dataRowMaxHeight ?? kMinInteractiveDimension; /// The firestore query that will be displayed final Query query; @@ -231,14 +231,13 @@ class _FirestoreTableState extends State { showFirstLastButtons: widget.showFirstLastButtons, sortAscending: widget.sortAscending, sortColumnIndex: widget.sortColumnIndex, - header: - actions.isEmpty ? null : (widget.header ?? const SizedBox()), + header: actions.isEmpty + ? null + : (widget.header ?? const SizedBox()), actions: actions.isEmpty ? null : actions, columns: [ for (final head in widget.columnLabels.values) - DataColumn( - label: head, - ) + DataColumn(label: head), ], ); }, @@ -260,17 +259,15 @@ class _FirestoreTableState extends State { return StatefulBuilder( builder: (context, setState) { void onTypeChanged(_PropertyType? newType) { - setState( - () { - // Delaying dispose as otherwise the next build - // will throw because it'll call "removeListener" - Future.delayed( - const Duration(milliseconds: 10), - formState.dispose, - ); - formState = _initialFormStateForType(newType); - }, - ); + setState(() { + // Delaying dispose as otherwise the next build + // will throw because it'll call "removeListener" + Future.delayed( + const Duration(milliseconds: 10), + formState.dispose, + ); + formState = _initialFormStateForType(newType); + }); } void onFormChange(_FormState newFormState) { @@ -279,8 +276,10 @@ class _FirestoreTableState extends State { return Dialog( child: Padding( - padding: - const EdgeInsets.symmetric(vertical: 16, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 16, + horizontal: 10, + ), child: DropdownButtonHideUnderline( child: Theme( data: Theme.of(context).copyWith( @@ -354,9 +353,7 @@ class _PropertyTypeForm extends StatelessWidget { controller: formState.controller, keyboardType: TextInputType.number, inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp('[0-9]+?.?[0-9]*'), - ), + FilteringTextInputFormatter.allow(RegExp('[0-9]+?.?[0-9]*')), ], decoration: InputDecoration(labelText: localizations.valueLabel), ), @@ -383,10 +380,7 @@ class _PropertyTypeForm extends StatelessWidget { } class _EditModalButtonBar extends StatelessWidget { - const _EditModalButtonBar({ - required this.formState, - required this.ref, - }); + const _EditModalButtonBar({required this.formState, required this.ref}); final _FormState formState; final DatabaseReference ref; @@ -477,11 +471,7 @@ _FormState _initialFormStateForType(_PropertyType? type) { } } -enum _PropertyType { - number, - boolean, - string, -} +enum _PropertyType { number, boolean, string } abstract class _FormState { const _FormState(); @@ -494,7 +484,7 @@ abstract class _FormState { class _NumberFormState extends _FormState { _NumberFormState(String text) - : controller = TextEditingController(text: text); + : controller = TextEditingController(text: text); final TextEditingController controller; @@ -510,7 +500,7 @@ class _NumberFormState extends _FormState { class _StringFormState extends _FormState { _StringFormState(String text) - : controller = TextEditingController(text: text); + : controller = TextEditingController(text: text); final TextEditingController controller; @@ -560,14 +550,11 @@ class _Source extends DataTableSource { required bool selectionEnabled, required int rowsPerPage, required this.onEditItem, - }) : _selectionEnabled = selectionEnabled, - _rowsPerpage = rowsPerPage; + }) : _selectionEnabled = selectionEnabled, + _rowsPerpage = rowsPerPage; - final void Function( - DataSnapshot snapshot, - Object? value, - String propertyName, - ) onEditItem; + final void Function(DataSnapshot snapshot, Object? value, String propertyName) + onEditItem; int _rowsPerpage; int get rowsPerPage => _rowsPerpage; @@ -589,7 +576,7 @@ class _Source extends DataTableSource { final Map Function() getHeaders; final void Function(Object error, StackTrace stackTrace)? Function() - getOnError; + getOnError; final _selectedRowIds = {}; @@ -660,7 +647,7 @@ class _Source extends DataTableSource { // such as when more content got loaded. final wereAllItemsSelected = _previousSnapshot?.docs.length == _selectedRowIds.length && - _previousSnapshot!.docs.isNotEmpty; + _previousSnapshot!.docs.isNotEmpty; _previousSnapshot = snapshot; if (wereAllItemsSelected) onSelectAll(true); @@ -682,9 +669,9 @@ class _Source extends DataTableSource { for (final doc in _previousSnapshot!.docs) { if (_selectedRowIds.contains(doc.key)) { doc.ref.remove().then( - (value) => _selectedRowIds.remove(doc.key), - onError: getOnError(), - ); + (value) => _selectedRowIds.remove(doc.key), + onError: getOnError(), + ); } } } diff --git a/packages/firebase_ui_database/pubspec.yaml b/packages/firebase_ui_database/pubspec.yaml index 846e95eaa..c65ffd3da 100644 --- a/packages/firebase_ui_database/pubspec.yaml +++ b/packages/firebase_ui_database/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: collection: ^1.18.0 diff --git a/packages/firebase_ui_firestore/example/lib/main.dart b/packages/firebase_ui_firestore/example/lib/main.dart index 50fe4ed0a..2f5ffb085 100644 --- a/packages/firebase_ui_firestore/example/lib/main.dart +++ b/packages/firebase_ui_firestore/example/lib/main.dart @@ -52,18 +52,13 @@ class FirebaseUIFirestoreExample extends StatelessWidget { class UserTile extends StatelessWidget { final User user; - const UserTile({ - super.key, - required this.user, - }); + const UserTile({super.key, required this.user}); @override Widget build(BuildContext context) { return Row( children: [ - CircleAvatar( - child: Text(user.firstName[0]), - ), + CircleAvatar(child: Text(user.firstName[0])), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -74,10 +69,7 @@ class UserTile extends StatelessWidget { '${user.firstName} ${user.lastName}', style: Theme.of(context).textTheme.titleMedium, ), - Text( - user.number, - style: Theme.of(context).textTheme.bodySmall, - ), + Text(user.number, style: Theme.of(context).textTheme.bodySmall), ], ), ], @@ -99,18 +91,18 @@ class User { required this.number, }); User.fromJson(Map json) - : this( - city: json['city'].toString(), - country: json['country'].toString(), - streetName: json['streetName'].toString(), - zipCode: json['zipCode'].toString(), - prefix: json['prefix'].toString(), - firstName: json['firstName'].toString(), - lastName: json['lastName'].toString(), - email: json['email'].toString(), - userName: json['userName'].toString(), - number: json['number'].toString(), - ); + : this( + city: json['city'].toString(), + country: json['country'].toString(), + streetName: json['streetName'].toString(), + zipCode: json['zipCode'].toString(), + prefix: json['prefix'].toString(), + firstName: json['firstName'].toString(), + lastName: json['lastName'].toString(), + email: json['email'].toString(), + userName: json['userName'].toString(), + number: json['number'].toString(), + ); final String city; final String country; diff --git a/packages/firebase_ui_firestore/example/pubspec.yaml b/packages/firebase_ui_firestore/example/pubspec.yaml index 6178f5705..b8b5a5a1f 100644 --- a/packages/firebase_ui_firestore/example/pubspec.yaml +++ b/packages/firebase_ui_firestore/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_firestore/lib/src/query_builder.dart b/packages/firebase_ui_firestore/lib/src/query_builder.dart index 8358c063c..bbf0329e7 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -12,11 +12,12 @@ import 'package:cloud_firestore/cloud_firestore.dart'; /// A function that builds a widget from a [FirestoreQueryBuilderSnapshot] /// /// See also [FirebaseDatabaseQueryBuilder]. -typedef FirestoreQueryBuilderSnapshotBuilder = Widget Function( - BuildContext context, - FirestoreQueryBuilderSnapshot snapshot, - Widget? child, -); +typedef FirestoreQueryBuilderSnapshotBuilder = + Widget Function( + BuildContext context, + FirestoreQueryBuilderSnapshot snapshot, + Widget? child, + ); /// {@template firebase_ui.firestore_query_builder} /// Listens to a query and paginates the result in a way that is compatible with @@ -167,8 +168,8 @@ class _FirestoreQueryBuilderState // "build" – most commonly ListView's itemBuilder Future.microtask(() => setState(() {})); - final expectedDocsCount = (_pageCount + 1) * widget.pageSize - + final expectedDocsCount = + (_pageCount + 1) * widget.pageSize /// The "+1" is used to voluntarily fetch one extra item, /// used to determine whether there is a next page or not. /// This extra item will not be rendered. @@ -180,43 +181,43 @@ class _FirestoreQueryBuilderState _querySubscription = query .snapshots(includeMetadataChanges: widget.includeMetadataChanges) .listen( - (event) { - setState(() { - if (nextPage) { - _snapshot = _snapshot.copyWith(isFetchingMore: false); - } else { - _snapshot = _snapshot.copyWith(isFetching: false); - } - - _snapshot = _snapshot.copyWith( - hasData: true, - docs: event.size < expectedDocsCount - ? event.docs - : event.docs.take(expectedDocsCount - 1).toList(), - error: null, - hasMore: event.size == expectedDocsCount, - stackTrace: null, - hasError: false, - ); - }); - }, - onError: (Object error, StackTrace stackTrace) { - setState(() { - if (nextPage) { - _snapshot = _snapshot.copyWith(isFetchingMore: false); - } else { - _snapshot = _snapshot.copyWith(isFetching: false); - } - - _snapshot = _snapshot.copyWith( - error: error, - stackTrace: stackTrace, - hasError: true, - hasMore: false, - ); - }); - }, - ); + (event) { + setState(() { + if (nextPage) { + _snapshot = _snapshot.copyWith(isFetchingMore: false); + } else { + _snapshot = _snapshot.copyWith(isFetching: false); + } + + _snapshot = _snapshot.copyWith( + hasData: true, + docs: event.size < expectedDocsCount + ? event.docs + : event.docs.take(expectedDocsCount - 1).toList(), + error: null, + hasMore: event.size == expectedDocsCount, + stackTrace: null, + hasError: false, + ); + }); + }, + onError: (Object error, StackTrace stackTrace) { + setState(() { + if (nextPage) { + _snapshot = _snapshot.copyWith(isFetchingMore: false); + } else { + _snapshot = _snapshot.copyWith(isFetching: false); + } + + _snapshot = _snapshot.copyWith( + error: error, + stackTrace: stackTrace, + hasError: true, + hasMore: false, + ); + }); + }, + ); } @override @@ -358,25 +359,19 @@ class _Sentinel { } /// A type representing the function passed to [FirestoreListView] for its `itemBuilder`. -typedef FirestoreItemBuilder = Widget Function( - BuildContext context, - QueryDocumentSnapshot doc, -); +typedef FirestoreItemBuilder = + Widget Function(BuildContext context, QueryDocumentSnapshot doc); /// A type representing the function passed to [FirestoreListView] for its `loadingBuilder`. typedef FirestoreLoadingBuilder = Widget Function(BuildContext context); /// A type representing the function passed to [FirestoreListView] for its `loadingIndicatorBuilder`. -typedef FirestoreFetchingIndicatorBuilder = Widget Function( - BuildContext context, -); +typedef FirestoreFetchingIndicatorBuilder = + Widget Function(BuildContext context); /// A type representing the function passed to [FirestoreListView] for its `errorBuilder`. -typedef FirestoreErrorBuilder = Widget Function( - BuildContext context, - Object error, - StackTrace stackTrace, -); +typedef FirestoreErrorBuilder = + Widget Function(BuildContext context, Object error, StackTrace stackTrace); /// A type representing the function passed to [FirestoreListView] for its `emptyBuilder`. typedef FirestoreEmptyBuilder = Widget Function(BuildContext context); @@ -465,86 +460,86 @@ class FirestoreListView extends FirestoreQueryBuilder { String? restorationId, Clip clipBehavior = Clip.hardEdge, }) : super( - builder: (context, snapshot, _) { - if (snapshot.isFetching) { - return loadingBuilder?.call(context) ?? - const Center(child: CircularProgressIndicator.adaptive()); - } - - if (snapshot.hasError && errorBuilder != null) { - return errorBuilder( - context, - snapshot.error!, - snapshot.stackTrace!, - ); - } - - if (snapshot.docs.isEmpty && emptyBuilder != null) { - return emptyBuilder(context); - } - - final itemCount = snapshot.docs.length; - - return ListView.builder( - itemCount: itemCount, - itemBuilder: (context, index) { - final isLastItem = index + 1 == itemCount; - if (!showFetchingIndicator && isLastItem && snapshot.hasMore) { - snapshot.fetchMore(); - } - - final doc = snapshot.docs[index]; - return showFetchingIndicator - ? OnMountListener( - onMount: () { - if (isLastItem && snapshot.hasMore) { - snapshot.fetchMore(); - } - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - itemBuilder(context, doc), - if (isLastItem && snapshot.hasMore) - fetchingIndicatorBuilder?.call(context) ?? - const Padding( - padding: EdgeInsets.symmetric( - vertical: 16.0, - ), - child: Center( - child: LoadingIndicator( - size: 30.0, - borderWidth: 2.0, - ), - ), - ), - ], - ), - ) - : itemBuilder(context, doc); - }, - scrollDirection: scrollDirection, - reverse: reverse, - controller: controller, - primary: primary, - physics: physics, - shrinkWrap: shrinkWrap, - padding: padding, - itemExtent: itemExtent, - prototypeItem: prototypeItem, - addAutomaticKeepAlives: addAutomaticKeepAlives, - addRepaintBoundaries: addRepaintBoundaries, - addSemanticIndexes: addSemanticIndexes, - // ignore: deprecated_member_use - cacheExtent: cacheExtent, - semanticChildCount: semanticChildCount, - dragStartBehavior: dragStartBehavior, - keyboardDismissBehavior: keyboardDismissBehavior, - restorationId: restorationId, - clipBehavior: clipBehavior, - ); - }, - ); + builder: (context, snapshot, _) { + if (snapshot.isFetching) { + return loadingBuilder?.call(context) ?? + const Center(child: CircularProgressIndicator.adaptive()); + } + + if (snapshot.hasError && errorBuilder != null) { + return errorBuilder( + context, + snapshot.error!, + snapshot.stackTrace!, + ); + } + + if (snapshot.docs.isEmpty && emptyBuilder != null) { + return emptyBuilder(context); + } + + final itemCount = snapshot.docs.length; + + return ListView.builder( + itemCount: itemCount, + itemBuilder: (context, index) { + final isLastItem = index + 1 == itemCount; + if (!showFetchingIndicator && isLastItem && snapshot.hasMore) { + snapshot.fetchMore(); + } + + final doc = snapshot.docs[index]; + return showFetchingIndicator + ? OnMountListener( + onMount: () { + if (isLastItem && snapshot.hasMore) { + snapshot.fetchMore(); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + itemBuilder(context, doc), + if (isLastItem && snapshot.hasMore) + fetchingIndicatorBuilder?.call(context) ?? + const Padding( + padding: EdgeInsets.symmetric( + vertical: 16.0, + ), + child: Center( + child: LoadingIndicator( + size: 30.0, + borderWidth: 2.0, + ), + ), + ), + ], + ), + ) + : itemBuilder(context, doc); + }, + scrollDirection: scrollDirection, + reverse: reverse, + controller: controller, + primary: primary, + physics: physics, + shrinkWrap: shrinkWrap, + padding: padding, + itemExtent: itemExtent, + prototypeItem: prototypeItem, + addAutomaticKeepAlives: addAutomaticKeepAlives, + addRepaintBoundaries: addRepaintBoundaries, + addSemanticIndexes: addSemanticIndexes, + // ignore: deprecated_member_use + cacheExtent: cacheExtent, + semanticChildCount: semanticChildCount, + dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, + restorationId: restorationId, + clipBehavior: clipBehavior, + ); + }, + ); /// Shows a separator between list items just as in [ListView.separated] FirestoreListView.separated({ @@ -577,86 +572,86 @@ class FirestoreListView extends FirestoreQueryBuilder { String? restorationId, Clip clipBehavior = Clip.hardEdge, }) : super( - builder: (context, snapshot, _) { - if (snapshot.isFetching) { - return loadingBuilder?.call(context) ?? - const Center(child: CircularProgressIndicator.adaptive()); - } - - if (snapshot.hasError && errorBuilder != null) { - return errorBuilder( - context, - snapshot.error!, - snapshot.stackTrace!, - ); - } - - if (snapshot.docs.isEmpty && emptyBuilder != null) { - return emptyBuilder(context); - } - - final itemCount = snapshot.docs.length; - - return ListView.separated( - itemCount: itemCount, - itemBuilder: (context, index) { - final isLastItem = index + 1 == itemCount; - if (!showFetchingIndicator && isLastItem && snapshot.hasMore) { - snapshot.fetchMore(); - } - - final doc = snapshot.docs[index]; - return showFetchingIndicator - ? OnMountListener( - onMount: () { - if (isLastItem && snapshot.hasMore) { - snapshot.fetchMore(); - } - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - itemBuilder(context, doc), - if (isLastItem && snapshot.hasMore) - fetchingIndicatorBuilder?.call(context) ?? - const Padding( - padding: EdgeInsets.symmetric( - vertical: 16.0, - ), - child: Center( - child: LoadingIndicator( - size: 30.0, - borderWidth: 2.0, - ), - ), - ), - ], - ), - ) - : itemBuilder(context, doc); - }, - separatorBuilder: separatorBuilder, - scrollDirection: scrollDirection, - reverse: reverse, - controller: controller, - primary: primary, - physics: physics, - shrinkWrap: shrinkWrap, - padding: padding, - // ignore: deprecated_member_use - findChildIndexCallback: findChildIndexCallback, - addAutomaticKeepAlives: addAutomaticKeepAlives, - addRepaintBoundaries: addRepaintBoundaries, - addSemanticIndexes: addSemanticIndexes, - // ignore: deprecated_member_use - cacheExtent: cacheExtent, - dragStartBehavior: dragStartBehavior, - keyboardDismissBehavior: keyboardDismissBehavior, - restorationId: restorationId, - clipBehavior: clipBehavior, - ); - }, - ); + builder: (context, snapshot, _) { + if (snapshot.isFetching) { + return loadingBuilder?.call(context) ?? + const Center(child: CircularProgressIndicator.adaptive()); + } + + if (snapshot.hasError && errorBuilder != null) { + return errorBuilder( + context, + snapshot.error!, + snapshot.stackTrace!, + ); + } + + if (snapshot.docs.isEmpty && emptyBuilder != null) { + return emptyBuilder(context); + } + + final itemCount = snapshot.docs.length; + + return ListView.separated( + itemCount: itemCount, + itemBuilder: (context, index) { + final isLastItem = index + 1 == itemCount; + if (!showFetchingIndicator && isLastItem && snapshot.hasMore) { + snapshot.fetchMore(); + } + + final doc = snapshot.docs[index]; + return showFetchingIndicator + ? OnMountListener( + onMount: () { + if (isLastItem && snapshot.hasMore) { + snapshot.fetchMore(); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + itemBuilder(context, doc), + if (isLastItem && snapshot.hasMore) + fetchingIndicatorBuilder?.call(context) ?? + const Padding( + padding: EdgeInsets.symmetric( + vertical: 16.0, + ), + child: Center( + child: LoadingIndicator( + size: 30.0, + borderWidth: 2.0, + ), + ), + ), + ], + ), + ) + : itemBuilder(context, doc); + }, + separatorBuilder: separatorBuilder, + scrollDirection: scrollDirection, + reverse: reverse, + controller: controller, + primary: primary, + physics: physics, + shrinkWrap: shrinkWrap, + padding: padding, + // ignore: deprecated_member_use + findChildIndexCallback: findChildIndexCallback, + addAutomaticKeepAlives: addAutomaticKeepAlives, + addRepaintBoundaries: addRepaintBoundaries, + addSemanticIndexes: addSemanticIndexes, + // ignore: deprecated_member_use + cacheExtent: cacheExtent, + dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, + restorationId: restorationId, + clipBehavior: clipBehavior, + ); + }, + ); } /// Listens to an aggregate query and passes the [AsyncSnapshot] to the builder. @@ -668,7 +663,8 @@ class AggregateQueryBuilder extends StatefulWidget { final Widget Function( BuildContext context, AsyncSnapshot snapshot, - ) builder; + ) + builder; const AggregateQueryBuilder({ super.key, diff --git a/packages/firebase_ui_firestore/lib/src/table_builder.dart b/packages/firebase_ui_firestore/lib/src/table_builder.dart index 580e7595b..32d36cc1b 100644 --- a/packages/firebase_ui_firestore/lib/src/table_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/table_builder.dart @@ -41,20 +41,21 @@ import 'query_builder.dart'; /// {@endtemplate} /// -typedef CellBuilder = Widget Function( - QueryDocumentSnapshot> snapshot, - String colKey, -); +typedef CellBuilder = + Widget Function( + QueryDocumentSnapshot> snapshot, + String colKey, + ); -typedef OnTapCell = void Function( - QueryDocumentSnapshot> snapshot, - Object? value, - String propertyName, -); +typedef OnTapCell = + void Function( + QueryDocumentSnapshot> snapshot, + Object? value, + String propertyName, + ); -typedef OnSelectedRows = void Function( - List>> items, -); +typedef OnSelectedRows = + void Function(List>> items); class FirestoreDataTable extends StatefulWidget { /// {@macro firebase_ui.firestore_table} @@ -84,12 +85,12 @@ class FirestoreDataTable extends StatefulWidget { this.enableDefaultCellEditor = true, this.onTapCell, this.onSelectedRows, - }) : assert( - columnLabels is LinkedHashMap, - 'only LinkedHashMap are supported as header', - ), - dataRowMinHeight = dataRowMinHeight ?? kMinInteractiveDimension, - dataRowMaxHeight = dataRowMaxHeight ?? kMinInteractiveDimension; + }) : assert( + columnLabels is LinkedHashMap, + 'only LinkedHashMap are supported as header', + ), + dataRowMinHeight = dataRowMinHeight ?? kMinInteractiveDimension, + dataRowMaxHeight = dataRowMaxHeight ?? kMinInteractiveDimension; /// When specified, the builder will be used to display your own widget for the cell final CellBuilder? cellBuilder; @@ -306,7 +307,7 @@ class _FirestoreTableState extends State { actions: actions.isEmpty ? null : actions, columns: [ for (final head in widget.columnLabels.values) - DataColumn(label: head) + DataColumn(label: head), ], ); }, @@ -332,17 +333,15 @@ class _FirestoreTableState extends State { return StatefulBuilder( builder: (context, setState) { void onTypeChanged(_PropertyType? newType) { - setState( - () { - // Delaying dispose as otherwise the next build - // will throw because it'll call "removeListener" - Future.delayed( - const Duration(milliseconds: 10), - formState.dispose, - ); - formState = _initialFormStateForType(newType); - }, - ); + setState(() { + // Delaying dispose as otherwise the next build + // will throw because it'll call "removeListener" + Future.delayed( + const Duration(milliseconds: 10), + formState.dispose, + ); + formState = _initialFormStateForType(newType); + }); } void onFormChange(_FormState newFormState) { @@ -351,8 +350,10 @@ class _FirestoreTableState extends State { return Dialog( child: Padding( - padding: - const EdgeInsets.symmetric(vertical: 16, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 16, + horizontal: 10, + ), child: DropdownButtonHideUnderline( child: Theme( data: Theme.of(context).copyWith( @@ -426,9 +427,7 @@ class _PropertyTypeForm extends StatelessWidget { controller: formState.controller, keyboardType: TextInputType.number, inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp('[0-9]+?.?[0-9]*'), - ), + FilteringTextInputFormatter.allow(RegExp('[0-9]+?.?[0-9]*')), ], decoration: InputDecoration(labelText: localizations.valueLabel), ), @@ -502,10 +501,7 @@ class _PropertyTypeForm extends StatelessWidget { } class _EditModalButtonBar extends StatelessWidget { - const _EditModalButtonBar({ - required this.formState, - required this.reference, - }); + const _EditModalButtonBar({required this.formState, required this.reference}); final _FormState formState; final DocumentReference reference; @@ -661,7 +657,7 @@ abstract class _FormState { class _NumberFormState extends _FormState { _NumberFormState(String text) - : controller = TextEditingController(text: text); + : controller = TextEditingController(text: text); final TextEditingController controller; @@ -677,7 +673,7 @@ class _NumberFormState extends _FormState { class _StringFormState extends _FormState { _StringFormState(String text) - : controller = TextEditingController(text: text); + : controller = TextEditingController(text: text); final TextEditingController controller; @@ -729,9 +725,9 @@ class _NullFormState extends _FormState { class _TimestampFormState extends _FormState { _TimestampFormState(DateTime date) - : controller = TextEditingController( - text: date.microsecondsSinceEpoch.toString(), - ); + : controller = TextEditingController( + text: date.microsecondsSinceEpoch.toString(), + ); final TextEditingController controller; @@ -742,9 +738,7 @@ class _TimestampFormState extends _FormState { _Edit submit(DocumentReference ref) { return _Edit( Timestamp.fromDate( - DateTime.fromMicrosecondsSinceEpoch( - int.parse(controller.text), - ), + DateTime.fromMicrosecondsSinceEpoch(int.parse(controller.text)), ), ); } @@ -754,11 +748,9 @@ class _TimestampFormState extends _FormState { } class _GeoPointFormState extends _FormState { - _GeoPointFormState({ - required String longitude, - required String latitude, - }) : latitudeController = TextEditingController(text: latitude), - longitudeController = TextEditingController(text: longitude); + _GeoPointFormState({required String longitude, required String latitude}) + : latitudeController = TextEditingController(text: latitude), + longitudeController = TextEditingController(text: longitude); final TextEditingController longitudeController; final TextEditingController latitudeController; @@ -785,7 +777,7 @@ class _GeoPointFormState extends _FormState { class _ReferenceFormState extends _FormState { _ReferenceFormState(String text) - : controller = TextEditingController(text: text); + : controller = TextEditingController(text: text); final TextEditingController controller; @@ -818,8 +810,8 @@ class _Source extends DataTableSource { required this.onTapCell, this.builder, this.onSelectedRows, - }) : _selectionEnabled = selectionEnabled, - _rowsPerpage = rowsPerPage; + }) : _selectionEnabled = selectionEnabled, + _rowsPerpage = rowsPerPage; final CellBuilder? builder; @@ -847,7 +839,7 @@ class _Source extends DataTableSource { final Map Function() getHeaders; final void Function(Object error, StackTrace stackTrace)? Function() - getOnError; + getOnError; final _selectedRowIds = {}; @@ -909,11 +901,7 @@ class _Source extends DataTableSource { builder?.call(doc, head) ?? _ValueView(data[head]), onTap: enableDefaultEditor ? () { - onTapCell( - doc, - data[head], - head, - ); + onTapCell(doc, data[head], head); } : null, ), @@ -940,7 +928,7 @@ class _Source extends DataTableSource { // such as when more content got loaded. final wereAllItemsSelected = _previousSnapshot?.docs.length == _selectedRowIds.length && - _previousSnapshot!.docs.isNotEmpty; + _previousSnapshot!.docs.isNotEmpty; _previousSnapshot = snapshot; if (wereAllItemsSelected) onSelectAll(true); @@ -962,9 +950,9 @@ class _Source extends DataTableSource { for (final doc in _previousSnapshot!.docs) { if (_selectedRowIds.contains(doc.id)) { doc.reference.delete().then( - (value) => _selectedRowIds.remove(doc.id), - onError: getOnError(), - ); + (value) => _selectedRowIds.remove(doc.id), + onError: getOnError(), + ); } } } diff --git a/packages/firebase_ui_firestore/pubspec.yaml b/packages/firebase_ui_firestore/pubspec.yaml index 69ba6d947..c362ca9ad 100644 --- a/packages/firebase_ui_firestore/pubspec.yaml +++ b/packages/firebase_ui_firestore/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: cloud_firestore: ^6.1.1 diff --git a/packages/firebase_ui_firestore/test/table_builder_test.dart b/packages/firebase_ui_firestore/test/table_builder_test.dart index dbd23f843..755ad1a8e 100644 --- a/packages/firebase_ui_firestore/test/table_builder_test.dart +++ b/packages/firebase_ui_firestore/test/table_builder_test.dart @@ -29,57 +29,49 @@ Future main() async { when(bob2Snapshot.data()).thenReturn(bob2.toMap()); }); - testWidgets( - 'FirestoreDataTable without CellBuilder is render as expected', - (WidgetTester tester) async { - await tester.pumpWidget(_dataTableBuilder(query: collection)); - mockCtrl.add(mockQuerySnapshot); + testWidgets('FirestoreDataTable without CellBuilder is render as expected', ( + WidgetTester tester, + ) async { + await tester.pumpWidget(_dataTableBuilder(query: collection)); + mockCtrl.add(mockQuerySnapshot); - await tester.pumpAndSettle(); + await tester.pumpAndSettle(); - final street = bob.address.street; - final city = bob.address.city; + final street = bob.address.street; + final city = bob.address.city; - final streetFinder = find.text('{street: $street, city: $city}'); - final firstNameFinder = find.text(bob.firstName); + final streetFinder = find.text('{street: $street, city: $city}'); + final firstNameFinder = find.text(bob.firstName); - expect(streetFinder, findsNWidgets(2)); - expect(firstNameFinder, findsOneWidget); - }, - ); + expect(streetFinder, findsNWidgets(2)); + expect(firstNameFinder, findsOneWidget); + }); - testWidgets( - 'FirestoreDataTable with CellBuilder is render as expected', - (WidgetTester tester) async { - await tester.pumpWidget( - _dataTableBuilder( - query: collection, - cellBuilder: _defaultCellBuilder, - ), - ); + testWidgets('FirestoreDataTable with CellBuilder is render as expected', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + _dataTableBuilder(query: collection, cellBuilder: _defaultCellBuilder), + ); - mockCtrl.add(mockQuerySnapshot); + mockCtrl.add(mockQuerySnapshot); - await tester.pumpAndSettle(); + await tester.pumpAndSettle(); - final cityFinder = find.text(bob.address.city); - final streetFinder = find.text(bob.address.street); - final firstNameFinder = find.text(bob.firstName); + final cityFinder = find.text(bob.address.city); + final streetFinder = find.text(bob.address.street); + final firstNameFinder = find.text(bob.firstName); - expect(cityFinder, findsNWidgets(2)); - expect(streetFinder, findsNWidgets(2)); - expect(firstNameFinder, findsOneWidget); - }, - ); + expect(cityFinder, findsNWidgets(2)); + expect(streetFinder, findsNWidgets(2)); + expect(firstNameFinder, findsOneWidget); + }); testWidgets( 'FirestoreDataTable with default dell dialog editor is render as expected', (WidgetTester tester) async { await tester.pumpWidget( - _dataTableBuilder( - query: collection, - cellBuilder: _defaultCellBuilder, - ), + _dataTableBuilder(query: collection, cellBuilder: _defaultCellBuilder), ); mockCtrl.add(mockQuerySnapshot); @@ -167,51 +159,50 @@ Future main() async { }, ); - testWidgets( - 'FirestoreDataTable row selection is capture', - (WidgetTester tester) async { - //For some reason, we have a renderflex issue when tapping - tester.view.physicalSize = const Size(1000, 2000); + testWidgets('FirestoreDataTable row selection is capture', ( + WidgetTester tester, + ) async { + //For some reason, we have a renderflex issue when tapping + tester.view.physicalSize = const Size(1000, 2000); + + var nbItemSelected = 0; + + await tester.pumpWidget( + _dataTableBuilder( + query: collection, + cellBuilder: _defaultCellBuilder, + enableDefaultCellEditor: false, + onSelectedRows: (selection) { + nbItemSelected = selection.length; + }, + ), + ); - var nbItemSelected = 0; + mockCtrl.add(mockQuerySnapshot); - await tester.pumpWidget( - _dataTableBuilder( - query: collection, - cellBuilder: _defaultCellBuilder, - enableDefaultCellEditor: false, - onSelectedRows: (selection) { - nbItemSelected = selection.length; - }, - ), - ); + await tester.pumpAndSettle(); - mockCtrl.add(mockQuerySnapshot); + final firstRowFinder = find.text(bob.firstName); + expect(firstRowFinder, findsOneWidget); - await tester.pumpAndSettle(); + await tester.tap(firstRowFinder); + await tester.pumpAndSettle(); - final firstRowFinder = find.text(bob.firstName); - expect(firstRowFinder, findsOneWidget); + expect(nbItemSelected, 1); - await tester.tap(firstRowFinder); - await tester.pumpAndSettle(); - - expect(nbItemSelected, 1); + final secondRowFinder = find.text(bob2.firstName); + expect(secondRowFinder, findsOneWidget); + await tester.tap(secondRowFinder); + await tester.pumpAndSettle(); - final secondRowFinder = find.text(bob2.firstName); - expect(secondRowFinder, findsOneWidget); - await tester.tap(secondRowFinder); - await tester.pumpAndSettle(); + expect(nbItemSelected, 2); - expect(nbItemSelected, 2); + await tester.tap(firstRowFinder); + await tester.tap(secondRowFinder); + await tester.pumpAndSettle(); - await tester.tap(firstRowFinder); - await tester.tap(secondRowFinder); - await tester.pumpAndSettle(); - - expect(nbItemSelected, 0); - }, - ); + expect(nbItemSelected, 0); + }); } Widget _defaultCellBuilder( @@ -225,10 +216,7 @@ Widget _defaultCellBuilder( return Text(person.firstName); case ColumnKey.address: return Row( - children: [ - Text(person.address.street), - Text(person.address.city), - ], + children: [Text(person.address.street), Text(person.address.city)], ); default: return Container(); @@ -257,26 +245,17 @@ Widget _dataTableBuilder({ ); } -enum ColumnKey { - firstName, - address, -} +enum ColumnKey { firstName, address } @immutable class Person { - const Person({ - required this.firstName, - required this.address, - }); + const Person({required this.firstName, required this.address}); final String firstName; final Address address; Map toMap() { - return { - 'firstName': firstName, - 'address': address.toMap(), - }; + return {'firstName': firstName, 'address': address.toMap()}; } factory Person.fromMap(Map map) { @@ -286,10 +265,7 @@ class Person { ); } - Person copyWith({ - String? firstName, - Address? address, - }) { + Person copyWith({String? firstName, Address? address}) { return Person( firstName: firstName ?? this.firstName, address: address ?? this.address, @@ -299,26 +275,17 @@ class Person { @immutable class Address { - const Address({ - required this.street, - required this.city, - }); + const Address({required this.street, required this.city}); final String street; final String city; Map toMap() { - return { - 'street': street, - 'city': city, - }; + return {'street': street, 'city': city}; } factory Address.fromMap(Map map) { - return Address( - street: map['street'] ?? '', - city: map['city'] ?? '', - ); + return Address(street: map['street'] ?? '', city: map['city'] ?? ''); } } @@ -390,10 +357,7 @@ class MockCollection extends Mock @override Query> limit([int? limit]) { return super.noSuchMethod( - Invocation.method( - #limit, - [limit], - ), + Invocation.method(#limit, [limit]), returnValue: mockQuery, returnValueForMissingStub: mockQuery, ); @@ -460,14 +424,8 @@ class MockQuerySnapshot extends Mock implements Snapshot { List>> get docs { return super.noSuchMethod( Invocation.getter(#docs), - returnValue: [ - bobSnapshot, - bob2Snapshot, - ], - returnValueForMissingStub: [ - bobSnapshot, - bob2Snapshot, - ], + returnValue: [bobSnapshot, bob2Snapshot], + returnValueForMissingStub: [bobSnapshot, bob2Snapshot], ); } } diff --git a/packages/firebase_ui_localizations/bin/add_label.dart b/packages/firebase_ui_localizations/bin/add_label.dart index c9d74fcab..1e7ff49e9 100644 --- a/packages/firebase_ui_localizations/bin/add_label.dart +++ b/packages/firebase_ui_localizations/bin/add_label.dart @@ -63,9 +63,6 @@ Future> addLabel( ...content, "@@last_modified": DateTime.now().toIso8601String(), name: englishTranslation, - "@$name": { - "description": description, - "placeholders": {}, - }, + "@$name": {"description": description, "placeholders": {}}, }; } diff --git a/packages/firebase_ui_localizations/bin/gen_l10n.dart b/packages/firebase_ui_localizations/bin/gen_l10n.dart index 6e42d14be..74575d00b 100644 --- a/packages/firebase_ui_localizations/bin/gen_l10n.dart +++ b/packages/firebase_ui_localizations/bin/gen_l10n.dart @@ -37,41 +37,44 @@ void main() async { parsed[0]: { ...(acc[parsed[0]] ?? {}), if (parsed.length > 1) parsed[1]: arbJson else 'default': arbJson, - } + }, }; }); final licenseHeader = await getLicenseHeader(); - final genOps = labelsByLocale.entries.map((entry) { - if (entry.value.length == 1) { - return [ - generateLocalizationsClass( - locale: entry.key, - arb: entry.value['default'], - licenseHeader: licenseHeader, - ) - ]; - } - - return [ - generateLocalizationsClass( - locale: entry.key, - arb: entry.value['default'], - licenseHeader: licenseHeader, - ), - ...entry.value.entries - .where((element) => element.key != 'default') - .map((e) { - return generateLocalizationsClass( - locale: entry.key, - countryCode: e.key, - arb: e.value, - licenseHeader: licenseHeader, - ); - }).toList(), - ]; - }).expand((element) => element); + final genOps = labelsByLocale.entries + .map((entry) { + if (entry.value.length == 1) { + return [ + generateLocalizationsClass( + locale: entry.key, + arb: entry.value['default'], + licenseHeader: licenseHeader, + ), + ]; + } + + return [ + generateLocalizationsClass( + locale: entry.key, + arb: entry.value['default'], + licenseHeader: licenseHeader, + ), + ...entry.value.entries + .where((element) => element.key != 'default') + .map((e) { + return generateLocalizationsClass( + locale: entry.key, + countryCode: e.key, + arb: e.value, + licenseHeader: licenseHeader, + ); + }) + .toList(), + ]; + }) + .expand((element) => element); await Future.wait([...genOps.cast()]); @@ -160,11 +163,7 @@ class Label { final String translation; final String? description; - Label({ - required this.key, - required this.translation, - this.description, - }); + Label({required this.key, required this.translation, this.description}); } Future getLicenseHeader() async { @@ -177,8 +176,9 @@ Future getLicenseHeader() async { .replaceAll('{{.Year}}', now.year.toString()) .split('\n') .map((e) { - return '// $e'; - }).join('\n'); + return '// $e'; + }) + .join('\n'); } Future generateDefaultLocalizations( @@ -193,8 +193,7 @@ Future generateDefaultLocalizations( translation: e.value, description: meta['description'], ); - }).toList() - ..sort((a, b) => a.key.compareTo(b.key)); + }).toList()..sort((a, b) => a.key.compareTo(b.key)); final content = await getDefaultLocalizationsContent(labels, licenseHeader); final outFile = File(path.join(outDir.path, 'default_localizations.dart')); diff --git a/packages/firebase_ui_localizations/example/lib/main.dart b/packages/firebase_ui_localizations/example/lib/main.dart index 082d6fe27..60ed4ec12 100644 --- a/packages/firebase_ui_localizations/example/lib/main.dart +++ b/packages/firebase_ui_localizations/example/lib/main.dart @@ -26,10 +26,7 @@ class MyApp extends StatelessWidget { builder: (context, setState) { return MaterialApp( title: 'Firebase UI Localizations Demo', - supportedLocales: const [ - Locale('en'), - Locale('fr'), - ], + supportedLocales: const [Locale('en'), Locale('fr')], locale: locale, localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, @@ -61,13 +58,7 @@ class MyApp extends StatelessWidget { ], ), ), - Expanded( - child: SignInScreen( - providers: [ - EmailAuthProvider(), - ], - ), - ), + Expanded(child: SignInScreen(providers: [EmailAuthProvider()])), ], ), ); diff --git a/packages/firebase_ui_localizations/example/pubspec.yaml b/packages/firebase_ui_localizations/example/pubspec.yaml index 330dbae4f..31e9f5a08 100644 --- a/packages/firebase_ui_localizations/example/pubspec.yaml +++ b/packages/firebase_ui_localizations/example/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_localizations/lib/src/l10n.dart b/packages/firebase_ui_localizations/lib/src/l10n.dart index d9053cda4..835d9e830 100644 --- a/packages/firebase_ui_localizations/lib/src/l10n.dart +++ b/packages/firebase_ui_localizations/lib/src/l10n.dart @@ -54,8 +54,7 @@ class FirebaseUILocalizations { /// /// See [FirebaseUILocalizationLabels]. static FirebaseUILocalizationDelegate - withDefaultOverrides( - T overrides) { + withDefaultOverrides(T overrides) { return FirebaseUILocalizationDelegate(overrides); } } diff --git a/packages/firebase_ui_localizations/pubspec.yaml b/packages/firebase_ui_localizations/pubspec.yaml index 98150fd8e..45080cd4f 100644 --- a/packages/firebase_ui_localizations/pubspec.yaml +++ b/packages/firebase_ui_localizations/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: flutter: diff --git a/packages/firebase_ui_localizations/test/firebase_ui_localizations_test.dart b/packages/firebase_ui_localizations/test/firebase_ui_localizations_test.dart index eabcf9a1b..2f5365b3a 100644 --- a/packages/firebase_ui_localizations/test/firebase_ui_localizations_test.dart +++ b/packages/firebase_ui_localizations/test/firebase_ui_localizations_test.dart @@ -13,123 +13,100 @@ const localeTW = Locale('zh', 'TW'); Future main() async { late FirebaseUILocalizationDelegate delegate; - group( - 'FirebaseUILocalization loads the appropriate Chinese translation', - () { - localizeText(BuildContext context) { - final labels = FirebaseUILocalizations.labelsOf(context); - return labels.signInWithPhoneButtonText; - } - - setUp(() async { - delegate = const FirebaseUILocalizationDelegate(); - }); - - test( - 'Loads the correct translation with the language tag "${localeZh.toLanguageTag()}"', - () async { - final localizations = await delegate.load(localeZh); - expect(localizations.labels.signInWithPhoneButtonText, '使用电话号码登录'); - }, - ); + group('FirebaseUILocalization loads the appropriate Chinese translation', () { + localizeText(BuildContext context) { + final labels = FirebaseUILocalizations.labelsOf(context); + return labels.signInWithPhoneButtonText; + } + + setUp(() async { + delegate = const FirebaseUILocalizationDelegate(); + }); + + test( + 'Loads the correct translation with the language tag "${localeZh.toLanguageTag()}"', + () async { + final localizations = await delegate.load(localeZh); + expect(localizations.labels.signInWithPhoneButtonText, '使用电话号码登录'); + }, + ); - testWidgets( - 'UI test for the "${localeZh.toLanguageTag()}" translation', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - locale: localeZh, - localizeText: localizeText, - ), - ); - expect(find.text('使用电话号码登录'), findsOneWidget); - }, + testWidgets('UI test for the "${localeZh.toLanguageTag()}" translation', ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp(locale: localeZh, localizeText: localizeText), ); + expect(find.text('使用电话号码登录'), findsOneWidget); + }); + + test( + 'Loads the correct translation with the language tag "${localeTW.toLanguageTag()}"', + () async { + final localizations = await delegate.load(localeTW); + expect(localizations.labels.signInWithPhoneButtonText, '使用電話號碼登入'); + }, + ); - test( - 'Loads the correct translation with the language tag "${localeTW.toLanguageTag()}"', - () async { - final localizations = await delegate.load(localeTW); - expect(localizations.labels.signInWithPhoneButtonText, '使用電話號碼登入'); - }, + testWidgets('UI test for the "${localeTW.toLanguageTag()}" translation', ( + tester, + ) async { + await tester.pumpWidget( + TestMaterialApp(locale: localeTW, localizeText: localizeText), ); + expect(find.text('使用電話號碼登入'), findsOneWidget); + }); + }); - testWidgets( - 'UI test for the "${localeTW.toLanguageTag()}" translation', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - locale: localeTW, - localizeText: localizeText, - ), - ); - expect(find.text('使用電話號碼登入'), findsOneWidget); - }, - ); - }, - ); - - group( - 'Localization override', - () { - localizeText(BuildContext context) { - return FirebaseUILocalizations.labelsOf(context).verifyEmailTitle; - } - - test( - 'Overrides the DefaultLocalizations', - () async { - final localizations = await const FirebaseUILocalizationDelegate( + group('Localization override', () { + localizeText(BuildContext context) { + return FirebaseUILocalizations.labelsOf(context).verifyEmailTitle; + } + + test('Overrides the DefaultLocalizations', () async { + final localizations = await const FirebaseUILocalizationDelegate( + DefaultLocalizationsOverrides(), + ).load(localeTW); + expect(localizations.labels.verifyEmailTitle, 'Overwritten'); + }); + + testWidgets('UI test for the default translation override', (tester) async { + await tester.pumpWidget( + TestMaterialApp( + locale: localeZh, + localizationsOverride: const FirebaseUILocalizationDelegate( DefaultLocalizationsOverrides(), - ).load(localeTW); - expect(localizations.labels.verifyEmailTitle, 'Overwritten'); - }, - ); - - testWidgets( - 'UI test for the default translation override', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - locale: localeZh, - localizationsOverride: const FirebaseUILocalizationDelegate( - DefaultLocalizationsOverrides(), - ), - localizeText: localizeText, - ), - ); - expect(find.text('Overwritten'), findsOneWidget); - }, - ); - - test( - 'Overrides the DefaultLocalizations', - () async { - final localizations = await const FirebaseUILocalizationDelegate( - ZhTWLocalizationsOverrides(), - ).load(localeTW); - expect(localizations.labels.verifyEmailTitle, '覆寫標題'); - }, + ), + localizeText: localizeText, + ), ); - - testWidgets( - 'UI test for the "${localeTW.toLanguageTag()}" translation override', - (tester) async { - await tester.pumpWidget( - TestMaterialApp( - // Test that 'en' labels are overridden by `ZhTWLocalizationsOverrides` overrides - locale: const Locale('en'), - localizationsOverride: const FirebaseUILocalizationDelegate( - ZhTWLocalizationsOverrides(), - ), - localizeText: localizeText, + expect(find.text('Overwritten'), findsOneWidget); + }); + + test('Overrides the DefaultLocalizations', () async { + final localizations = await const FirebaseUILocalizationDelegate( + ZhTWLocalizationsOverrides(), + ).load(localeTW); + expect(localizations.labels.verifyEmailTitle, '覆寫標題'); + }); + + testWidgets( + 'UI test for the "${localeTW.toLanguageTag()}" translation override', + (tester) async { + await tester.pumpWidget( + TestMaterialApp( + // Test that 'en' labels are overridden by `ZhTWLocalizationsOverrides` overrides + locale: const Locale('en'), + localizationsOverride: const FirebaseUILocalizationDelegate( + ZhTWLocalizationsOverrides(), ), - ); - expect(find.text('覆寫標題'), findsOneWidget); - }, - ); - }, - ); + localizeText: localizeText, + ), + ); + expect(find.text('覆寫標題'), findsOneWidget); + }, + ); + }); } class DefaultLocalizationsOverrides extends DefaultLocalizations { @@ -170,11 +147,7 @@ class TestMaterialApp extends StatelessWidget { ? FirebaseUILocalizations.delegate : localizationsOverride!, ], - home: Builder( - builder: (context) => Text( - localizeText.call(context), - ), - ), + home: Builder(builder: (context) => Text(localizeText.call(context))), ); } } diff --git a/packages/firebase_ui_oauth/example/lib/main.dart b/packages/firebase_ui_oauth/example/lib/main.dart index fcb01c2c7..e7cd367f3 100644 --- a/packages/firebase_ui_oauth/example/lib/main.dart +++ b/packages/firebase_ui_oauth/example/lib/main.dart @@ -23,29 +23,31 @@ class OAuthProviderButtonExample extends StatelessWidget { @override Widget build(BuildContext context) { - return Settings(builder: (context, library, brightness, buttonVariant) { - if (library == DesignLibrary.material) { - return MaterialApp( - theme: ThemeData(brightness: brightness), - home: Scaffold( - body: Content( - designLibrary: library, - buttonVariant: buttonVariant, + return Settings( + builder: (context, library, brightness, buttonVariant) { + if (library == DesignLibrary.material) { + return MaterialApp( + theme: ThemeData(brightness: brightness), + home: Scaffold( + body: Content( + designLibrary: library, + buttonVariant: buttonVariant, + ), ), - ), - ); - } else { - return CupertinoApp( - theme: CupertinoThemeData(brightness: brightness), - home: CupertinoPageScaffold( - child: Content( - designLibrary: library, - buttonVariant: buttonVariant, + ); + } else { + return CupertinoApp( + theme: CupertinoThemeData(brightness: brightness), + home: CupertinoPageScaffold( + child: Content( + designLibrary: library, + buttonVariant: buttonVariant, + ), ), - ), - ); - } - }); + ); + } + }, + ); } } @@ -103,19 +105,11 @@ class _ContentState extends State { 'Sign in with Facebook', ), _button( - GoogleProvider( - clientId: '', - redirectUri: '', - scopes: [], - ), + GoogleProvider(clientId: '', redirectUri: '', scopes: []), 'Sign in with Google', ), _button( - TwitterProvider( - apiKey: '', - apiSecretKey: '', - redirectUri: '', - ), + TwitterProvider(apiKey: '', apiSecretKey: '', redirectUri: ''), 'Sign in with Twitter', ), ], diff --git a/packages/firebase_ui_oauth/example/lib/src/settings.dart b/packages/firebase_ui_oauth/example/lib/src/settings.dart index 8ca8da4e2..2554ed3b3 100644 --- a/packages/firebase_ui_oauth/example/lib/src/settings.dart +++ b/packages/firebase_ui_oauth/example/lib/src/settings.dart @@ -4,15 +4,9 @@ import 'package:flutter/material.dart'; -enum DesignLibrary { - cupertino, - material, -} +enum DesignLibrary { cupertino, material } -enum ButtonVariant { - icon, - full, -} +enum ButtonVariant { icon, full } class SettingsChip extends StatelessWidget { final VoidCallback onTap; @@ -59,7 +53,8 @@ class Settings extends StatefulWidget { DesignLibrary library, Brightness brightness, ButtonVariant buttonVariant, - ) builder; + ) + builder; const Settings({ super.key, diff --git a/packages/firebase_ui_oauth/example/pubspec.yaml b/packages/firebase_ui_oauth/example/pubspec.yaml index 7ee549d6a..7593a04ef 100644 --- a/packages/firebase_ui_oauth/example/pubspec.yaml +++ b/packages/firebase_ui_oauth/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_oauth/lib/src/oauth_provider_button_base.dart b/packages/firebase_ui_oauth/lib/src/oauth_provider_button_base.dart index b9a835947..d6fa74604 100644 --- a/packages/firebase_ui_oauth/lib/src/oauth_provider_button_base.dart +++ b/packages/firebase_ui_oauth/lib/src/oauth_provider_button_base.dart @@ -18,10 +18,8 @@ typedef ErrorBuilder = Widget Function(Exception e); /// A callback that is being called when there are different oauth providers /// associated with the same email. /// {@endtemplate} -typedef DifferentProvidersFoundCallback = void Function( - List providers, - fba.AuthCredential? credential, -); +typedef DifferentProvidersFoundCallback = + void Function(List providers, fba.AuthCredential? credential); /// {@template ui.oauth.oauth_provider_button_base.signed_in_callback} /// A callback that is being called when the user signs in. @@ -132,8 +130,8 @@ class OAuthProviderButtonBase extends StatefulWidget { /// {@macro ui.oauth.oauth_provider_button_base.on_cancelled} this.onCancelled, - }) : assert(!overrideDefaultTapAction || onTap != null), - _padding = size * 1.33 / 2; + }) : assert(!overrideDefaultTapAction || onTap != null), + _padding = size * 1.33 / 2; @override State createState() => @@ -394,29 +392,18 @@ class _ButtonContent extends StatelessWidget { Widget build(BuildContext context) { final icon = Padding( padding: EdgeInsets.all(iconPadding), - child: SvgPicture.string( - iconSrc, - width: height, - height: height, - ), + child: SvgPicture.string(iconSrc, width: height, height: height), ); if (label.isEmpty) { if (!isLoading) return icon; - return SizedBox.square( - dimension: fontSize, - child: loadingIndicator, - ); + return SizedBox.square(dimension: fontSize, child: loadingIndicator); } final text = TextSpan( text: label, - style: TextStyle( - height: 1.1, - color: textColor, - fontSize: fontSize, - ), + style: TextStyle(height: 1.1, color: textColor, fontSize: fontSize), ); return Row( @@ -438,13 +425,13 @@ class _ButtonContent extends StatelessWidget { if (isLoading) { // "fontSize" is also the indicator's width final freeSpace = totalButtonWidth - fontSize; - final startPadding = - (freeSpace / 2 - totalIconWidth).clamp(0.0, availableWidth); + final startPadding = (freeSpace / 2 - totalIconWidth).clamp( + 0.0, + availableWidth, + ); return Padding( - padding: EdgeInsetsDirectional.only( - start: startPadding, - ), + padding: EdgeInsetsDirectional.only(start: startPadding), child: Align( alignment: AlignmentDirectional.centerStart, child: SizedBox.square( @@ -463,12 +450,12 @@ class _ButtonContent extends StatelessWidget { text: text, textDirection: Directionality.of(context), maxLines: 1, - )..layout(maxWidth: availableWidth)) - .size - .width; + )..layout(maxWidth: availableWidth)).size.width; final freeSpace = totalButtonWidth - textWidth; - final startPadding = - (freeSpace / 2 - totalIconWidth).clamp(0.0, availableWidth); + final startPadding = (freeSpace / 2 - totalIconWidth).clamp( + 0.0, + availableWidth, + ); return Padding( padding: EdgeInsetsDirectional.only( @@ -478,10 +465,7 @@ class _ButtonContent extends StatelessWidget { child: FittedBox( fit: BoxFit.scaleDown, alignment: AlignmentDirectional.centerStart, - child: Text.rich( - text, - style: text.style, - ), + child: Text.rich(text, style: text.style), ), ); }, @@ -497,18 +481,14 @@ class _ButtonContent extends StatelessWidget { class _MaterialForeground extends StatelessWidget { final VoidCallback onTap; - const _MaterialForeground({ - required this.onTap, - }); + const _MaterialForeground({required this.onTap}); @override Widget build(BuildContext context) { return Positioned.fill( child: Material( color: Colors.transparent, - child: InkWell( - onTap: onTap, - ), + child: InkWell(onTap: onTap), ), ); } diff --git a/packages/firebase_ui_oauth/lib/src/oauth_provider_button_style.dart b/packages/firebase_ui_oauth/lib/src/oauth_provider_button_style.dart index b959d1a15..5ad02f16a 100644 --- a/packages/firebase_ui_oauth/lib/src/oauth_provider_button_style.dart +++ b/packages/firebase_ui_oauth/lib/src/oauth_provider_button_style.dart @@ -26,11 +26,11 @@ abstract class ThemedOAuthProviderButtonStyle { /// The widget to display for custom OAuth providers in pages such as the /// Profile Screen. ThemedValue get iconWidget => ThemedValue( - // Display the light icon on a dark background. - SvgPicture.string(iconSrc.light), - // Display the dark icon on a light background. - SvgPicture.string(iconSrc.dark), - ); + // Display the light icon on a dark background. + SvgPicture.string(iconSrc.light), + // Display the dark icon on a light background. + SvgPicture.string(iconSrc.dark), + ); /// {@macro ui.oauth.themed_oauth_provider_button_style} const ThemedOAuthProviderButtonStyle(); diff --git a/packages/firebase_ui_oauth/lib/src/platform_oauth_sign_in.dart b/packages/firebase_ui_oauth/lib/src/platform_oauth_sign_in.dart index f11247882..8ae84eccd 100644 --- a/packages/firebase_ui_oauth/lib/src/platform_oauth_sign_in.dart +++ b/packages/firebase_ui_oauth/lib/src/platform_oauth_sign_in.dart @@ -37,19 +37,21 @@ mixin PlatformSignInMixin { /// Handles authentication logic on desktop platforms void desktopSignIn(AuthAction action) { - DesktopWebviewAuth.signIn(desktopSignInArgs).then((value) { - if (value == null) throw AuthCancelledException(); - - final oauthCredential = fromDesktopAuthResult(value); - onCredentialReceived(oauthCredential, action); - }).catchError((err) { - if (err is AuthCancelledException) { - authListener.onCanceled(); - return; - } - - authListener.onError(err); - }); + DesktopWebviewAuth.signIn(desktopSignInArgs) + .then((value) { + if (value == null) throw AuthCancelledException(); + + final oauthCredential = fromDesktopAuthResult(value); + onCredentialReceived(oauthCredential, action); + }) + .catchError((err) { + if (err is AuthCancelledException) { + authListener.onCanceled(); + return; + } + + authListener.onError(err); + }); } /// Handles authentication logic on mobile platforms. diff --git a/packages/firebase_ui_oauth/pubspec.yaml b/packages/firebase_ui_oauth/pubspec.yaml index 89ced8811..d677efc78 100644 --- a/packages/firebase_ui_oauth/pubspec.yaml +++ b/packages/firebase_ui_oauth/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: desktop_webview_auth: ^0.0.16 diff --git a/packages/firebase_ui_oauth/test/flutterfire_ui_oauth_test.dart b/packages/firebase_ui_oauth/test/flutterfire_ui_oauth_test.dart index 7abdad99a..55ec8d785 100644 --- a/packages/firebase_ui_oauth/test/flutterfire_ui_oauth_test.dart +++ b/packages/firebase_ui_oauth/test/flutterfire_ui_oauth_test.dart @@ -161,8 +161,9 @@ void main() { expect(textFinder, findsOneWidget); }); - testWidgets('applies dark theme background color from style', - (tester) async { + testWidgets('applies dark theme background color from style', ( + tester, + ) async { await tester.pumpWidget(renderMaterialButton(Brightness.dark)); final containerFinder = find.byWidgetPredicate( @@ -199,25 +200,27 @@ void main() { }); testWidgets('has layout flow aware padding', (tester) async { - await tester.pumpWidget(DefaultAssetBundle( - bundle: FakeAssetBundle(), - child: MaterialApp( - home: Scaffold( - body: Row( - children: [ - Expanded( - child: OAuthProviderButtonBase( - provider: provider, - auth: FakeAuth(), - label: 'Sign in with Fake provider', - loadingIndicator: const CircularProgressIndicator(), + await tester.pumpWidget( + DefaultAssetBundle( + bundle: FakeAssetBundle(), + child: MaterialApp( + home: Scaffold( + body: Row( + children: [ + Expanded( + child: OAuthProviderButtonBase( + provider: provider, + auth: FakeAuth(), + label: 'Sign in with Fake provider', + loadingIndicator: const CircularProgressIndicator(), + ), ), - ) - ], + ], + ), ), ), ), - )); + ); expect(find.byType(LayoutFlowAwarePadding), findsOneWidget); }); diff --git a/packages/firebase_ui_oauth_apple/lib/firebase_ui_oauth_apple.dart b/packages/firebase_ui_oauth_apple/lib/firebase_ui_oauth_apple.dart index 2aed31f2e..bb2efaf58 100644 --- a/packages/firebase_ui_oauth_apple/lib/firebase_ui_oauth_apple.dart +++ b/packages/firebase_ui_oauth_apple/lib/firebase_ui_oauth_apple.dart @@ -26,9 +26,7 @@ class AppleSignInButton extends _AppleSignInButton { super.size, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - ); + }) : super(isLoading: isLoading ?? false); } class AppleSignInIconButton extends _AppleSignInButton { @@ -45,10 +43,7 @@ class AppleSignInIconButton extends _AppleSignInButton { super.size, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - label: '', - ); + }) : super(isLoading: isLoading ?? false, label: ''); } AppleProvider? _mockProvider; @@ -90,9 +85,9 @@ class _AppleSignInButton extends StatelessWidget { double? size, this.onError, this.onCanceled, - }) : label = label ?? 'Sign in with Apple', - overrideDefaultTapAction = overrideDefaultTapAction ?? false, - size = size ?? 19; + }) : label = label ?? 'Sign in with Apple', + overrideDefaultTapAction = overrideDefaultTapAction ?? false, + size = size ?? 19; AppleProvider get provider { if (_mockProvider != null) { diff --git a/packages/firebase_ui_oauth_apple/lib/src/theme.dart b/packages/firebase_ui_oauth_apple/lib/src/theme.dart index e5f79c2b2..3fcd9f2f5 100644 --- a/packages/firebase_ui_oauth_apple/lib/src/theme.dart +++ b/packages/firebase_ui_oauth_apple/lib/src/theme.dart @@ -33,10 +33,7 @@ const _iconSvgDark = ''' '''; -const _iconSrc = ThemedIconSrc( - _iconSvgLight, - _iconSvgDark, -); +const _iconSrc = ThemedIconSrc(_iconSvgLight, _iconSvgDark); class AppleProviderButtonStyle extends ThemedOAuthProviderButtonStyle { const AppleProviderButtonStyle(); diff --git a/packages/firebase_ui_oauth_apple/pubspec.yaml b/packages/firebase_ui_oauth_apple/pubspec.yaml index f245454e7..11e753003 100644 --- a/packages/firebase_ui_oauth_apple/pubspec.yaml +++ b/packages/firebase_ui_oauth_apple/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: firebase_auth: ^6.1.3 diff --git a/packages/firebase_ui_oauth_facebook/lib/firebase_ui_oauth_facebook.dart b/packages/firebase_ui_oauth_facebook/lib/firebase_ui_oauth_facebook.dart index b8c834d96..71f77b631 100644 --- a/packages/firebase_ui_oauth_facebook/lib/firebase_ui_oauth_facebook.dart +++ b/packages/firebase_ui_oauth_facebook/lib/firebase_ui_oauth_facebook.dart @@ -29,9 +29,7 @@ class FacebookSignInButton extends _FacebookSignInButton { super.size, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - ); + }) : super(isLoading: isLoading ?? false); } class FacebookSignInIconButton extends _FacebookSignInButton { @@ -50,10 +48,7 @@ class FacebookSignInIconButton extends _FacebookSignInButton { super.redirectUri, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - label: '', - ); + }) : super(isLoading: isLoading ?? false, label: ''); } FacebookProvider? _mockProvider; @@ -99,17 +94,14 @@ class _FacebookSignInButton extends StatelessWidget { this.redirectUri, this.onError, this.onCanceled, - }) : label = label ?? 'Sign in with Facebook', - overrideDefaultTapAction = overrideDefaultTapAction ?? false, - size = size ?? 19; + }) : label = label ?? 'Sign in with Facebook', + overrideDefaultTapAction = overrideDefaultTapAction ?? false, + size = size ?? 19; FacebookProvider get provider { if (_mockProvider != null) return _mockProvider!; - return FacebookProvider( - clientId: clientId, - redirectUri: redirectUri, - ); + return FacebookProvider(clientId: clientId, redirectUri: redirectUri); } @override diff --git a/packages/firebase_ui_oauth_facebook/lib/src/provider.dart b/packages/firebase_ui_oauth_facebook/lib/src/provider.dart index 9c033b141..bd7370ed4 100644 --- a/packages/firebase_ui_oauth_facebook/lib/src/provider.dart +++ b/packages/firebase_ui_oauth_facebook/lib/src/provider.dart @@ -30,18 +30,17 @@ class FacebookProvider extends OAuthProvider { redirectUri: redirectUri ?? defaultRedirectUri, ); - FacebookProvider({ - required this.clientId, - this.redirectUri, - }); + FacebookProvider({required this.clientId, this.redirectUri}); /// Generates a cryptographically secure random nonce for limited login String _generateNonce([int length = 32]) { const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._'; final random = Random.secure(); - return List.generate(length, (_) => charset[random.nextInt(charset.length)]) - .join(); + return List.generate( + length, + (_) => charset[random.nextInt(charset.length)], + ).join(); } /// Returns the SHA256 hash of the given string @@ -81,8 +80,9 @@ class FacebookProvider extends OAuthProvider { // Check the token type to determine if it's classic or limited login if (accessToken.type == AccessTokenType.classic) { // Classic login - use access token - credential = - fba.FacebookAuthProvider.credential(accessToken.tokenString); + credential = fba.FacebookAuthProvider.credential( + accessToken.tokenString, + ); } else if (accessToken.type == AccessTokenType.limited) { // Limited login - use ID token with nonce if (_rawNonce == null) { @@ -91,10 +91,9 @@ class FacebookProvider extends OAuthProvider { ); return; } - credential = fba.OAuthProvider(providerId).credential( - idToken: accessToken.tokenString, - rawNonce: _rawNonce, - ); + credential = fba.OAuthProvider( + providerId, + ).credential(idToken: accessToken.tokenString, rawNonce: _rawNonce); } else { authListener.onError( Exception('Unknown access token type: ${accessToken.type}'), @@ -141,8 +140,9 @@ class FacebookProvider extends OAuthProvider { final hasPermission = await _hasTrackingPermission(); // Determine login tracking mode - final loginTracking = - hasPermission ? LoginTracking.enabled : LoginTracking.limited; + final loginTracking = hasPermission + ? LoginTracking.enabled + : LoginTracking.limited; // Generate nonce for limited login if (loginTracking == LoginTracking.limited) { diff --git a/packages/firebase_ui_oauth_facebook/pubspec.yaml b/packages/firebase_ui_oauth_facebook/pubspec.yaml index 7543c855f..3b579a319 100644 --- a/packages/firebase_ui_oauth_facebook/pubspec.yaml +++ b/packages/firebase_ui_oauth_facebook/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: firebase_auth: ^6.1.3 diff --git a/packages/firebase_ui_oauth_facebook/test/facebook_provider_test.dart b/packages/firebase_ui_oauth_facebook/test/facebook_provider_test.dart index 80013fa15..c1e3e3c84 100644 --- a/packages/firebase_ui_oauth_facebook/test/facebook_provider_test.dart +++ b/packages/firebase_ui_oauth_facebook/test/facebook_provider_test.dart @@ -338,10 +338,7 @@ class MockAccessToken implements AccessToken { @override final AccessTokenType type; - MockAccessToken({ - required this.tokenString, - required this.type, - }); + MockAccessToken({required this.tokenString, required this.type}); String get applicationId => 'test-app-id'; @@ -381,11 +378,7 @@ class MockLoginResult implements LoginResult { @override final String? message; - MockLoginResult({ - required this.status, - this.accessToken, - this.message, - }); + MockLoginResult({required this.status, this.accessToken, this.message}); Map toJson() => {}; } diff --git a/packages/firebase_ui_oauth_google/lib/firebase_ui_oauth_google.dart b/packages/firebase_ui_oauth_google/lib/firebase_ui_oauth_google.dart index 084a0d490..5d1b3a165 100644 --- a/packages/firebase_ui_oauth_google/lib/firebase_ui_oauth_google.dart +++ b/packages/firebase_ui_oauth_google/lib/firebase_ui_oauth_google.dart @@ -29,9 +29,7 @@ class GoogleSignInButton extends _GoogleSignInButton { super.size, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - ); + }) : super(isLoading: isLoading ?? false); } class GoogleSignInIconButton extends _GoogleSignInButton { @@ -51,10 +49,7 @@ class GoogleSignInIconButton extends _GoogleSignInButton { super.redirectUri, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - label: '', - ); + }) : super(isLoading: isLoading ?? false, label: ''); } GoogleProvider? _mockProvider; @@ -102,9 +97,9 @@ class _GoogleSignInButton extends StatelessWidget { this.redirectUri, this.onError, this.onCanceled, - }) : label = label ?? 'Sign in with Google', - overrideDefaultTapAction = overrideDefaultTapAction ?? false, - size = size ?? 19; + }) : label = label ?? 'Sign in with Google', + overrideDefaultTapAction = overrideDefaultTapAction ?? false, + size = size ?? 19; GoogleProvider get provider { if (_mockProvider != null) return _mockProvider!; diff --git a/packages/firebase_ui_oauth_google/lib/src/provider.dart b/packages/firebase_ui_oauth_google/lib/src/provider.dart index 44f208fbe..48e2f0dc2 100644 --- a/packages/firebase_ui_oauth_google/lib/src/provider.dart +++ b/packages/firebase_ui_oauth_google/lib/src/provider.dart @@ -55,10 +55,7 @@ class GoogleProvider extends OAuthProvider { if (_ignoreClientId()) { provider = GoogleSignIn(scopes: scopes ?? []); } else { - provider = GoogleSignIn( - clientId: clientId, - scopes: scopes ?? [], - ); + provider = GoogleSignIn(clientId: clientId, scopes: scopes ?? []); } } @@ -73,19 +70,23 @@ class GoogleProvider extends OAuthProvider { @override void mobileSignIn(AuthAction action) async { - provider.signIn().then((user) { - if (user == null) throw AuthCancelledException(); - return user.authentication; - }).then((auth) { - final credential = fba.GoogleAuthProvider.credential( - accessToken: auth.accessToken, - idToken: auth.idToken, - ); - - onCredentialReceived(credential, action); - }).catchError((err) { - authListener.onError(err); - }); + provider + .signIn() + .then((user) { + if (user == null) throw AuthCancelledException(); + return user.authentication; + }) + .then((auth) { + final credential = fba.GoogleAuthProvider.credential( + accessToken: auth.accessToken, + idToken: auth.idToken, + ); + + onCredentialReceived(credential, action); + }) + .catchError((err) { + authListener.onError(err); + }); } @override diff --git a/packages/firebase_ui_oauth_google/pubspec.yaml b/packages/firebase_ui_oauth_google/pubspec.yaml index 456bbe809..990b6d7bc 100644 --- a/packages/firebase_ui_oauth_google/pubspec.yaml +++ b/packages/firebase_ui_oauth_google/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: firebase_auth: ^6.1.3 diff --git a/packages/firebase_ui_oauth_twitter/lib/firebase_ui_oauth_twitter.dart b/packages/firebase_ui_oauth_twitter/lib/firebase_ui_oauth_twitter.dart index 0a4480fd3..3b9bbb5a6 100644 --- a/packages/firebase_ui_oauth_twitter/lib/firebase_ui_oauth_twitter.dart +++ b/packages/firebase_ui_oauth_twitter/lib/firebase_ui_oauth_twitter.dart @@ -29,9 +29,7 @@ class TwitterSignInButton extends _TwitterSignInButton { super.size, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - ); + }) : super(isLoading: isLoading ?? false); } class TwitterSignInIconButton extends _TwitterSignInButton { @@ -51,10 +49,7 @@ class TwitterSignInIconButton extends _TwitterSignInButton { super.redirectUri, super.onError, super.onCanceled, - }) : super( - isLoading: isLoading ?? false, - label: '', - ); + }) : super(isLoading: isLoading ?? false, label: ''); } TwitterProvider? _mockProvider; @@ -102,9 +97,9 @@ class _TwitterSignInButton extends StatelessWidget { this.redirectUri, this.onError, this.onCanceled, - }) : label = label ?? 'Sign in with Twitter', - overrideDefaultTapAction = overrideDefaultTapAction ?? false, - size = size ?? 19; + }) : label = label ?? 'Sign in with Twitter', + overrideDefaultTapAction = overrideDefaultTapAction ?? false, + size = size ?? 19; TwitterProvider get provider { if (_mockProvider != null) return _mockProvider!; diff --git a/packages/firebase_ui_oauth_twitter/lib/src/provider.dart b/packages/firebase_ui_oauth_twitter/lib/src/provider.dart index 30c154890..10d5420c0 100644 --- a/packages/firebase_ui_oauth_twitter/lib/src/provider.dart +++ b/packages/firebase_ui_oauth_twitter/lib/src/provider.dart @@ -42,26 +42,28 @@ class TwitterProvider extends OAuthProvider { void mobileSignIn(AuthAction action) { final result = provider.login(); - result.then((value) { - switch (value.status!) { - case TwitterLoginStatus.loggedIn: - final credential = TwitterAuthProvider.credential( - accessToken: value.authToken!, - secret: value.authTokenSecret!, - ); + result + .then((value) { + switch (value.status!) { + case TwitterLoginStatus.loggedIn: + final credential = TwitterAuthProvider.credential( + accessToken: value.authToken!, + secret: value.authTokenSecret!, + ); - onCredentialReceived(credential, action); - break; - case TwitterLoginStatus.cancelledByUser: - authListener.onError(AuthCancelledException()); - break; - case TwitterLoginStatus.error: - authListener.onError(Exception(value.errorMessage)); - break; - } - }).catchError((err) { - authListener.onError(err); - }); + onCredentialReceived(credential, action); + break; + case TwitterLoginStatus.cancelledByUser: + authListener.onError(AuthCancelledException()); + break; + case TwitterLoginStatus.error: + authListener.onError(Exception(value.errorMessage)); + break; + } + }) + .catchError((err) { + authListener.onError(err); + }); } @override diff --git a/packages/firebase_ui_oauth_twitter/pubspec.yaml b/packages/firebase_ui_oauth_twitter/pubspec.yaml index 1ebbdaf60..b57fbf5d5 100644 --- a/packages/firebase_ui_oauth_twitter/pubspec.yaml +++ b/packages/firebase_ui_oauth_twitter/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/fi resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: flutter: diff --git a/packages/firebase_ui_shared/lib/src/loading_button.dart b/packages/firebase_ui_shared/lib/src/loading_button.dart index 080ddabc5..c02089155 100644 --- a/packages/firebase_ui_shared/lib/src/loading_button.dart +++ b/packages/firebase_ui_shared/lib/src/loading_button.dart @@ -23,10 +23,7 @@ class _LoadingButtonContent extends StatelessWidget { if (color != null) { final theme = Theme.of(context).textTheme.labelLarge; - child = Text( - label, - style: theme?.copyWith(color: color), - ); + child = Text(label, style: theme?.copyWith(color: color)); } else { child = Text(label); } diff --git a/packages/firebase_ui_shared/lib/src/loading_indicator.dart b/packages/firebase_ui_shared/lib/src/loading_indicator.dart index 60730f15b..d89b4ae30 100644 --- a/packages/firebase_ui_shared/lib/src/loading_indicator.dart +++ b/packages/firebase_ui_shared/lib/src/loading_indicator.dart @@ -31,19 +31,12 @@ class LoadingIndicator extends PlatformWidget { @override Widget? buildWrapper(BuildContext context, Widget child) { - return SizedBox( - width: size, - height: size, - child: child, - ); + return SizedBox(width: size, height: size, child: child); } @override Widget buildCupertino(BuildContext context) { - return CupertinoActivityIndicator( - radius: size / 2, - color: color, - ); + return CupertinoActivityIndicator(radius: size / 2, color: color); } @override diff --git a/packages/firebase_ui_shared/lib/src/universal_button.dart b/packages/firebase_ui_shared/lib/src/universal_button.dart index b714eec3a..ffaf4d462 100644 --- a/packages/firebase_ui_shared/lib/src/universal_button.dart +++ b/packages/firebase_ui_shared/lib/src/universal_button.dart @@ -166,11 +166,7 @@ class UniversalButton extends PlatformWidget { } else { switch (variant) { case ButtonVariant.text: - return TextButton( - onPressed: onPressed, - style: style, - child: child, - ); + return TextButton(onPressed: onPressed, style: style, child: child); case ButtonVariant.filled: return ElevatedButton( onPressed: onPressed, diff --git a/packages/firebase_ui_shared/lib/src/universal_icon.dart b/packages/firebase_ui_shared/lib/src/universal_icon.dart index 09662de79..4265d9a59 100644 --- a/packages/firebase_ui_shared/lib/src/universal_icon.dart +++ b/packages/firebase_ui_shared/lib/src/universal_icon.dart @@ -24,19 +24,11 @@ class UniversalIcon extends PlatformWidget { @override Widget buildCupertino(BuildContext context) { - return Icon( - cupertinoIcon, - color: color, - size: size, - ); + return Icon(cupertinoIcon, color: color, size: size); } @override Widget buildMaterial(BuildContext context) { - return Icon( - materialIcon, - color: color, - size: size, - ); + return Icon(materialIcon, color: color, size: size); } } diff --git a/packages/firebase_ui_shared/pubspec.yaml b/packages/firebase_ui_shared/pubspec.yaml index 15fb08c50..2ff014d42 100644 --- a/packages/firebase_ui_shared/pubspec.yaml +++ b/packages/firebase_ui_shared/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/firebase/FirebaseUI-Flutter/packages/firebase_ui_sh resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: flutter: diff --git a/packages/firebase_ui_shared/test/loading_button_test.dart b/packages/firebase_ui_shared/test/loading_button_test.dart index 49f89f7fa..94671ada6 100644 --- a/packages/firebase_ui_shared/test/loading_button_test.dart +++ b/packages/firebase_ui_shared/test/loading_button_test.dart @@ -15,10 +15,7 @@ void main() { await tester.pumpWidget( MaterialApp( home: Scaffold( - body: LoadingButton( - label: 'label', - onTap: () {}, - ), + body: LoadingButton(label: 'label', onTap: () {}), ), ), ); @@ -26,48 +23,47 @@ void main() { expect(find.text('label'), findsOneWidget); }); - testWidgets( - 'shows loading indicator when isLoading = true', - (tester) async { - var isLoading = false; - var completer = Completer(); - - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: StatefulBuilder( - builder: (context, setState) => LoadingButton( - label: 'button', - onTap: () async { - setState(() { - isLoading = !isLoading; - }); - - await completer.future; - - setState(() { - isLoading = !isLoading; - }); - }, - isLoading: isLoading, - ), + testWidgets('shows loading indicator when isLoading = true', ( + tester, + ) async { + var isLoading = false; + var completer = Completer(); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: StatefulBuilder( + builder: (context, setState) => LoadingButton( + label: 'button', + onTap: () async { + setState(() { + isLoading = !isLoading; + }); + + await completer.future; + + setState(() { + isLoading = !isLoading; + }); + }, + isLoading: isLoading, ), ), ), - ); + ), + ); - expect(find.byType(CircularProgressIndicator), findsNothing); - await tester.tap(find.text('button')); - await tester.pump(); + expect(find.byType(CircularProgressIndicator), findsNothing); + await tester.tap(find.text('button')); + await tester.pump(); - expect(find.byType(CircularProgressIndicator), findsOneWidget); + expect(find.byType(CircularProgressIndicator), findsOneWidget); - completer.complete(); - await tester.pump(); + completer.complete(); + await tester.pump(); - expect(find.byType(CircularProgressIndicator), findsNothing); - }, - ); + expect(find.byType(CircularProgressIndicator), findsNothing); + }); testWidgets('works under CupertinoApp', (tester) async { var isLoading = false; diff --git a/packages/firebase_ui_shared/test/loading_indicator_test.dart b/packages/firebase_ui_shared/test/loading_indicator_test.dart index f85b89a02..d02a5e779 100644 --- a/packages/firebase_ui_shared/test/loading_indicator_test.dart +++ b/packages/firebase_ui_shared/test/loading_indicator_test.dart @@ -8,28 +8,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - const home = Scaffold( - body: LoadingIndicator( - size: 30, - borderWidth: 2, - ), - ); + const home = Scaffold(body: LoadingIndicator(size: 30, borderWidth: 2)); group('LoadingIndicator', () { - testWidgets( - 'uses CircularProgressIndicator under MaterialApp', - (tester) async { - await tester.pumpWidget(const MaterialApp(home: home)); - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - ); + testWidgets('uses CircularProgressIndicator under MaterialApp', ( + tester, + ) async { + await tester.pumpWidget(const MaterialApp(home: home)); + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); - testWidgets( - 'uses CupertinoActivityIndicator under MaterialApp', - (tester) async { - await tester.pumpWidget(const CupertinoApp(home: home)); - expect(find.byType(CupertinoActivityIndicator), findsOneWidget); - }, - ); + testWidgets('uses CupertinoActivityIndicator under MaterialApp', ( + tester, + ) async { + await tester.pumpWidget(const CupertinoApp(home: home)); + expect(find.byType(CupertinoActivityIndicator), findsOneWidget); + }); }); } diff --git a/packages/firebase_ui_shared/test/platform_widget_test.dart b/packages/firebase_ui_shared/test/platform_widget_test.dart index 5a73a036b..a4b8ef7c2 100644 --- a/packages/firebase_ui_shared/test/platform_widget_test.dart +++ b/packages/firebase_ui_shared/test/platform_widget_test.dart @@ -32,53 +32,32 @@ class PlatformAware extends PlatformWidget { void main() { group('PlatformWidget', () { - testWidgets( - 'builds cupertino widget if CupertinoApp is used', - (tester) async { - await tester.pumpWidget( - const CupertinoApp( - home: PlatformAware(), - ), - ); + testWidgets('builds cupertino widget if CupertinoApp is used', ( + tester, + ) async { + await tester.pumpWidget(const CupertinoApp(home: PlatformAware())); - expect(find.text('Cupertino'), findsOneWidget); - expect(find.text('Material'), findsNothing); - }, - ); + expect(find.text('Cupertino'), findsOneWidget); + expect(find.text('Material'), findsNothing); + }); - testWidgets( - 'builds material widget if MaterialApp is used', - (tester) async { - await tester.pumpWidget( - const MaterialApp( - home: PlatformAware(), - ), - ); + testWidgets('builds material widget if MaterialApp is used', ( + tester, + ) async { + await tester.pumpWidget(const MaterialApp(home: PlatformAware())); - expect(find.text('Cupertino'), findsNothing); - expect(find.text('Material'), findsOneWidget); - }, - ); + expect(find.text('Cupertino'), findsNothing); + expect(find.text('Material'), findsOneWidget); + }); - testWidgets( - 'builds wrapper widget if it is implemented', - (tester) async { - await tester.pumpWidget( - const MaterialApp( - home: PlatformAware(), - ), - ); + testWidgets('builds wrapper widget if it is implemented', (tester) async { + await tester.pumpWidget(const MaterialApp(home: PlatformAware())); - expect(find.byKey(const ValueKey('wrapper')), findsOneWidget); + expect(find.byKey(const ValueKey('wrapper')), findsOneWidget); - await tester.pumpWidget( - const CupertinoApp( - home: PlatformAware(), - ), - ); + await tester.pumpWidget(const CupertinoApp(home: PlatformAware())); - expect(find.byKey(const ValueKey('wrapper')), findsOneWidget); - }, - ); + expect(find.byKey(const ValueKey('wrapper')), findsOneWidget); + }); }); } diff --git a/packages/firebase_ui_shared/test/universal_button_test.dart b/packages/firebase_ui_shared/test/universal_button_test.dart index 6cf8efe66..8f9856d17 100644 --- a/packages/firebase_ui_shared/test/universal_button_test.dart +++ b/packages/firebase_ui_shared/test/universal_button_test.dart @@ -12,9 +12,7 @@ void main() { testWidgets('renders text as content', (tester) async { await tester.pumpWidget( const MaterialApp( - home: Scaffold( - body: UniversalButton(text: 'text'), - ), + home: Scaffold(body: UniversalButton(text: 'text')), ), ); @@ -22,9 +20,7 @@ void main() { await tester.pumpWidget( const CupertinoApp( - home: Scaffold( - body: UniversalButton(text: 'text'), - ), + home: Scaffold(body: UniversalButton(text: 'text')), ), ); @@ -35,10 +31,7 @@ void main() { await tester.pumpWidget( const MaterialApp( home: Scaffold( - body: UniversalButton( - text: 'text', - child: Text('child'), - ), + body: UniversalButton(text: 'text', child: Text('child')), ), ), ); @@ -49,10 +42,7 @@ void main() { await tester.pumpWidget( const CupertinoApp( home: Scaffold( - body: UniversalButton( - text: 'text', - child: Text('child'), - ), + body: UniversalButton(text: 'text', child: Text('child')), ), ), ); @@ -67,10 +57,7 @@ void main() { await tester.pumpWidget( const MaterialApp( home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.text, - ), + body: UniversalButton(text: 'text', variant: ButtonVariant.text), ), ), ); @@ -79,87 +66,69 @@ void main() { }, ); - testWidgets( - 'renders OutlinedButton under MaterialApp when variant ' - 'is ButtonVariant.text', - (tester) async { - await tester.pumpWidget( - const MaterialApp( - home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.outlined, - ), + testWidgets('renders OutlinedButton under MaterialApp when variant ' + 'is ButtonVariant.text', (tester) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: UniversalButton( + text: 'text', + variant: ButtonVariant.outlined, ), ), - ); + ), + ); - expect(find.byType(OutlinedButton), findsOneWidget); - }, - ); + expect(find.byType(OutlinedButton), findsOneWidget); + }); - testWidgets( - 'renders ElevatedButton under MaterialApp when variant ' - 'is ButtonVariant.text', - (tester) async { - await tester.pumpWidget( - const MaterialApp( - home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.filled, - ), - ), + testWidgets('renders ElevatedButton under MaterialApp when variant ' + 'is ButtonVariant.text', (tester) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: UniversalButton(text: 'text', variant: ButtonVariant.filled), ), - ); + ), + ); - expect(find.byType(ElevatedButton), findsOneWidget); - }, - ); + expect(find.byType(ElevatedButton), findsOneWidget); + }); - testWidgets( - 'renders CupertinoButton under CupertinoApp', - (tester) async { - await tester.pumpWidget( - const CupertinoApp( - home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.text, - ), - ), + testWidgets('renders CupertinoButton under CupertinoApp', (tester) async { + await tester.pumpWidget( + const CupertinoApp( + home: Scaffold( + body: UniversalButton(text: 'text', variant: ButtonVariant.text), ), - ); + ), + ); - expect(find.byType(CupertinoButton), findsOneWidget); + expect(find.byType(CupertinoButton), findsOneWidget); - await tester.pumpWidget( - const CupertinoApp( - home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.filled, - ), - ), + await tester.pumpWidget( + const CupertinoApp( + home: Scaffold( + body: UniversalButton(text: 'text', variant: ButtonVariant.filled), ), - ); + ), + ); - expect(find.byType(CupertinoButton), findsOneWidget); + expect(find.byType(CupertinoButton), findsOneWidget); - await tester.pumpWidget( - const CupertinoApp( - home: Scaffold( - body: UniversalButton( - text: 'text', - variant: ButtonVariant.outlined, - ), + await tester.pumpWidget( + const CupertinoApp( + home: Scaffold( + body: UniversalButton( + text: 'text', + variant: ButtonVariant.outlined, ), ), - ); + ), + ); - expect(find.byType(CupertinoButton), findsOneWidget); - }, - ); + expect(find.byType(CupertinoButton), findsOneWidget); + }); testWidgets('calls onPressed when button is tapped', (tester) async { var pressed = 0; @@ -170,10 +139,7 @@ void main() { await tester.pumpWidget( MaterialApp( home: Scaffold( - body: UniversalButton( - text: 'press me', - onPressed: onPressed, - ), + body: UniversalButton(text: 'press me', onPressed: onPressed), ), ), ); @@ -186,10 +152,7 @@ void main() { await tester.pumpWidget( CupertinoApp( home: Scaffold( - body: UniversalButton( - text: 'press me', - onPressed: onPressed, - ), + body: UniversalButton(text: 'press me', onPressed: onPressed), ), ), ); diff --git a/packages/firebase_ui_shared/test/universal_icon_test.dart b/packages/firebase_ui_shared/test/universal_icon_test.dart index 5bc28cf7a..bdbe7d9a6 100644 --- a/packages/firebase_ui_shared/test/universal_icon_test.dart +++ b/packages/firebase_ui_shared/test/universal_icon_test.dart @@ -15,9 +15,7 @@ void main() { group('UniversalIcon', () { testWidgets('uses cupertinoIcon under CupertinoApp', (tester) async { await tester.pumpWidget( - const CupertinoApp( - home: UniversalScaffold(body: icon), - ), + const CupertinoApp(home: UniversalScaffold(body: icon)), ); expect(find.byIcon(CupertinoIcons.check_mark), findsOneWidget); @@ -26,9 +24,7 @@ void main() { testWidgets('uses materialIcon under MaterialApp', (tester) async { await tester.pumpWidget( - const MaterialApp( - home: UniversalScaffold(body: icon), - ), + const MaterialApp(home: UniversalScaffold(body: icon)), ); expect(find.byIcon(CupertinoIcons.check_mark), findsNothing); diff --git a/packages/firebase_ui_shared/test/universal_scaffold_test.dart b/packages/firebase_ui_shared/test/universal_scaffold_test.dart index 91e245556..946a95c65 100644 --- a/packages/firebase_ui_shared/test/universal_scaffold_test.dart +++ b/packages/firebase_ui_shared/test/universal_scaffold_test.dart @@ -11,29 +11,20 @@ void main() { group('UniversalScaffold', () { testWidgets('uses Scaffold under MaterialApp', (tester) async { await tester.pumpWidget( - const MaterialApp( - home: UniversalScaffold( - body: Text('body'), - ), - ), + const MaterialApp(home: UniversalScaffold(body: Text('body'))), ); expect(find.byType(Scaffold), findsOneWidget); }); - testWidgets( - 'uses CupertinoPageScaffold under CupertinoApp', - (tester) async { - await tester.pumpWidget( - const CupertinoApp( - home: UniversalScaffold( - body: Text('body'), - ), - ), - ); + testWidgets('uses CupertinoPageScaffold under CupertinoApp', ( + tester, + ) async { + await tester.pumpWidget( + const CupertinoApp(home: UniversalScaffold(body: Text('body'))), + ); - expect(find.byType(CupertinoPageScaffold), findsOneWidget); - }, - ); + expect(find.byType(CupertinoPageScaffold), findsOneWidget); + }); }); } diff --git a/packages/firebase_ui_storage/example/lib/main.dart b/packages/firebase_ui_storage/example/lib/main.dart index 47b3d73eb..43704db17 100644 --- a/packages/firebase_ui_storage/example/lib/main.dart +++ b/packages/firebase_ui_storage/example/lib/main.dart @@ -16,9 +16,7 @@ Future main() async { final storage = FirebaseStorage.instance; - final config = FirebaseUIStorageConfiguration( - storage: storage, - ); + final config = FirebaseUIStorageConfiguration(storage: storage); await FirebaseUIStorage.configure(config); @@ -32,10 +30,7 @@ class FirebaseUIStorageExample extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: 'FirebaseUI Storage Example', - theme: ThemeData( - primarySwatch: Colors.pink, - useMaterial3: true, - ), + theme: ThemeData(primarySwatch: Colors.pink, useMaterial3: true), home: const Home(), ); } @@ -59,10 +54,7 @@ class _HomeState extends State { itemBuilder: (context, ref) { return AspectRatio( aspectRatio: 1, - child: StorageImage( - ref: ref, - fit: BoxFit.cover, - ), + child: StorageImage(ref: ref, fit: BoxFit.cover), ); }, ); @@ -75,10 +67,7 @@ class _HomeState extends State { itemBuilder: (context, ref) { return AspectRatio( aspectRatio: 1, - child: StorageImage( - ref: ref, - fit: BoxFit.cover, - ), + child: StorageImage(ref: ref, fit: BoxFit.cover), ); }, ); @@ -104,14 +93,8 @@ class _HomeState extends State { currentIndex: _selectedIndex, onTap: (index) => setState(() => _selectedIndex = index), items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.list), - label: 'List', - ), - BottomNavigationBarItem( - icon: Icon(Icons.grid_on), - label: 'Grid', - ), + BottomNavigationBarItem(icon: Icon(Icons.list), label: 'List'), + BottomNavigationBarItem(icon: Icon(Icons.grid_on), label: 'Grid'), ], ), body: Column( @@ -125,25 +108,27 @@ class _HomeState extends State { ), Padding( padding: const EdgeInsets.all(16.0), - child: Builder(builder: (context) { - return UploadButton( - onError: (error, _) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(error.toString())), - ); - }, - onUploadComplete: (ref) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Upload complete')), - ); - - setState(() { - key = GlobalKey(); - }); - }, - ); - }), - ) + child: Builder( + builder: (context) { + return UploadButton( + onError: (error, _) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(error.toString()))); + }, + onUploadComplete: (ref) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Upload complete')), + ); + + setState(() { + key = GlobalKey(); + }); + }, + ); + }, + ), + ), ], ), ); diff --git a/packages/firebase_ui_storage/example/lib/src/progress_bar_app.dart b/packages/firebase_ui_storage/example/lib/src/progress_bar_app.dart index 50c915ff0..214324730 100644 --- a/packages/firebase_ui_storage/example/lib/src/progress_bar_app.dart +++ b/packages/firebase_ui_storage/example/lib/src/progress_bar_app.dart @@ -28,10 +28,7 @@ class MockSnapshot implements TaskSnapshot { @override final int totalBytes; - MockSnapshot({ - required this.bytesTransferred, - required this.totalBytes, - }); + MockSnapshot({required this.bytesTransferred, required this.totalBytes}); @override noSuchMethod(Invocation invocation) { @@ -63,10 +60,7 @@ class _ProgressBarAppState extends State { Future emitProgress() async { for (var i = 0; i <= 10; i++) { await Future.delayed(const Duration(milliseconds: 300)); - task.ctrl.add(MockSnapshot( - bytesTransferred: i * 10, - totalBytes: 100, - )); + task.ctrl.add(MockSnapshot(bytesTransferred: i * 10, totalBytes: 100)); } } diff --git a/packages/firebase_ui_storage/example/lib/src/storage_image_app.dart b/packages/firebase_ui_storage/example/lib/src/storage_image_app.dart index b92977ef8..fee4d428d 100644 --- a/packages/firebase_ui_storage/example/lib/src/storage_image_app.dart +++ b/packages/firebase_ui_storage/example/lib/src/storage_image_app.dart @@ -8,7 +8,8 @@ import 'package:flutter/material.dart'; import 'apps.dart'; -const preloadedBlurhash = ':eDJq[9wo~xUbKNexqWG-@M|xuRlt7ayWVoMIwskxVIvs+slNHt' +const preloadedBlurhash = + ':eDJq[9wo~xUbKNexqWG-@M|xuRlt7ayWVoMIwskxVIvs+slNHt' '2j]j?RiocR%fRo0oJtRW=V@t2R*bHoMfSbca#oJaybHj@flbIsoWCbHaya}bHoeazbIayofWC' 'n~j[R*oJ'; diff --git a/packages/firebase_ui_storage/example/lib/src/upload_button_app.dart b/packages/firebase_ui_storage/example/lib/src/upload_button_app.dart index addf48996..566a5031f 100644 --- a/packages/firebase_ui_storage/example/lib/src/upload_button_app.dart +++ b/packages/firebase_ui_storage/example/lib/src/upload_button_app.dart @@ -16,15 +16,11 @@ class UploadButtonApp extends StatelessWidget implements App { @override Widget build(BuildContext context) { return UploadButton( - onError: (e, s) => ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(e.toString()), - ), - ), + onError: (e, s) => ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toString()))), onUploadComplete: (ref) => ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Upload complete: ${ref.fullPath}'), - ), + SnackBar(content: Text('Upload complete: ${ref.fullPath}')), ), variant: ButtonVariant.filled, ); diff --git a/packages/firebase_ui_storage/example/lib/storybook.dart b/packages/firebase_ui_storage/example/lib/storybook.dart index fe4a4347a..892541dac 100644 --- a/packages/firebase_ui_storage/example/lib/storybook.dart +++ b/packages/firebase_ui_storage/example/lib/storybook.dart @@ -80,9 +80,7 @@ class FirebaseUIStorageGallery extends StatelessWidget { Widget buildCupertino(BuildContext context, Brightness brightness) { return CupertinoApp( title: 'Firebase UI Storage Gallery', - theme: CupertinoThemeData( - brightness: brightness, - ), + theme: CupertinoThemeData(brightness: brightness), home: const Gallery(), ); } @@ -100,10 +98,7 @@ class Gallery extends StatelessWidget { Expanded( child: Row( children: [ - const SizedBox( - width: 200, - child: AppList(), - ), + const SizedBox(width: 200, child: AppList()), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -111,9 +106,8 @@ class Gallery extends StatelessWidget { children: [ ValueListenableBuilder( valueListenable: app, - builder: (context, app, _) => Expanded( - child: Center(child: app), - ), + builder: (context, app, _) => + Expanded(child: Center(child: app)), ), ], ), @@ -208,13 +202,11 @@ class Toolbar extends PlatformWidget { designLib.value == DesignLib.cupertino, ], onPressed: (index) { - designLib.value = - index == 0 ? DesignLib.material : DesignLib.cupertino; + designLib.value = index == 0 + ? DesignLib.material + : DesignLib.cupertino; }, - children: const [ - Icon(Icons.android), - Icon(Icons.apple), - ], + children: const [Icon(Icons.android), Icon(Icons.apple)], ), ], ); @@ -222,9 +214,6 @@ class Toolbar extends PlatformWidget { @override Widget? buildWrapper(BuildContext context, Widget child) { - return Padding( - padding: const EdgeInsets.all(8), - child: child, - ); + return Padding(padding: const EdgeInsets.all(8), child: child); } } diff --git a/packages/firebase_ui_storage/example/pubspec.yaml b/packages/firebase_ui_storage/example/pubspec.yaml index b71e71f75..e8e6f8f7a 100644 --- a/packages/firebase_ui_storage/example/pubspec.yaml +++ b/packages/firebase_ui_storage/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 0.1.0 environment: - sdk: ^3.5.0 + sdk: ^3.9.0 resolution: workspace diff --git a/packages/firebase_ui_storage/lib/src/config.dart b/packages/firebase_ui_storage/lib/src/config.dart index ae90c5e89..1bd12ea22 100644 --- a/packages/firebase_ui_storage/lib/src/config.dart +++ b/packages/firebase_ui_storage/lib/src/config.dart @@ -59,10 +59,7 @@ class UuidFileUploadNamingPolicy implements FileUploadNamingPolicy { final Uuid uuid; final V4Options? options; - const UuidFileUploadNamingPolicy({ - this.uuid = const Uuid(), - this.options, - }); + const UuidFileUploadNamingPolicy({this.uuid = const Uuid(), this.options}); @override String getUploadFileName(String fullPath) { diff --git a/packages/firebase_ui_storage/lib/src/file_picker.dart b/packages/firebase_ui_storage/lib/src/file_picker.dart index 0993d1daf..6a22749e7 100644 --- a/packages/firebase_ui_storage/lib/src/file_picker.dart +++ b/packages/firebase_ui_storage/lib/src/file_picker.dart @@ -9,13 +9,8 @@ class FilePicker { final List mimeTypes; final XTypeGroup _typeGroup; - FilePicker({ - this.extensions = const [], - this.mimeTypes = const [], - }) : _typeGroup = XTypeGroup( - extensions: extensions, - mimeTypes: mimeTypes, - ); + FilePicker({this.extensions = const [], this.mimeTypes = const []}) + : _typeGroup = XTypeGroup(extensions: extensions, mimeTypes: mimeTypes); Future pickFile() async { final file = await openFile(acceptedTypeGroups: [_typeGroup]); diff --git a/packages/firebase_ui_storage/lib/src/lib.dart b/packages/firebase_ui_storage/lib/src/lib.dart index 312184d6a..d2f41e5bc 100644 --- a/packages/firebase_ui_storage/lib/src/lib.dart +++ b/packages/firebase_ui_storage/lib/src/lib.dart @@ -38,9 +38,7 @@ class FirebaseUIStorage { } /// Configures FirebaseUIStorage to be used with a [FirebaseStorage]. - static Future configure( - FirebaseUIStorageConfiguration config, - ) async { + static Future configure(FirebaseUIStorageConfiguration config) async { final storage = config.storage; if (isConfigured(storage)) { diff --git a/packages/firebase_ui_storage/lib/src/paginated_loading_controller.dart b/packages/firebase_ui_storage/lib/src/paginated_loading_controller.dart index 7c0b57d05..76cb3c074 100644 --- a/packages/firebase_ui_storage/lib/src/paginated_loading_controller.dart +++ b/packages/firebase_ui_storage/lib/src/paginated_loading_controller.dart @@ -28,30 +28,21 @@ class PageLoadComplete extends PaginatedLoadingState { final List pageItems; final List items; - const PageLoadComplete({ - required this.pageItems, - required this.items, - }); + const PageLoadComplete({required this.pageItems, required this.items}); } class PageLoadError extends PaginatedLoadingState { final Object? error; final List? items; - const PageLoadError({ - required this.error, - this.items, - }); + const PageLoadError({required this.error, this.items}); } class PaginatedLoadingController extends ChangeNotifier { int pageSize; final Reference ref; - PaginatedLoadingController({ - required this.ref, - this.pageSize = 50, - }) { + PaginatedLoadingController({required this.ref, this.pageSize = 50}) { load(); } @@ -62,10 +53,7 @@ class PaginatedLoadingController extends ChangeNotifier { List? _items; ListOptions get _listOptions { - return ListOptions( - maxResults: pageSize, - pageToken: _cursor?.nextPageToken, - ); + return ListOptions(maxResults: pageSize, pageToken: _cursor?.nextPageToken); } Future load() { @@ -84,15 +72,9 @@ class PaginatedLoadingController extends ChangeNotifier { _cursor = value; (_items ??= []).addAll(value.items); - _state = PageLoadComplete( - pageItems: value.items, - items: _items!, - ); + _state = PageLoadComplete(pageItems: value.items, items: _items!); } catch (err) { - _state = PageLoadError( - error: err, - items: _items, - ); + _state = PageLoadError(error: err, items: _items); } finally { completer.complete(); notifyListeners(); diff --git a/packages/firebase_ui_storage/lib/src/widgets/default_loading_indicator.dart b/packages/firebase_ui_storage/lib/src/widgets/default_loading_indicator.dart index b36a0c665..6d6f0831f 100644 --- a/packages/firebase_ui_storage/lib/src/widgets/default_loading_indicator.dart +++ b/packages/firebase_ui_storage/lib/src/widgets/default_loading_indicator.dart @@ -10,11 +10,6 @@ class DefaultLoadingIndicator extends StatelessWidget { @override Widget build(BuildContext context) { - return const Center( - child: LoadingIndicator( - size: 32, - borderWidth: 2, - ), - ); + return const Center(child: LoadingIndicator(size: 32, borderWidth: 2)); } } diff --git a/packages/firebase_ui_storage/lib/src/widgets/grid_view.dart b/packages/firebase_ui_storage/lib/src/widgets/grid_view.dart index bc3496f47..c97e297c2 100644 --- a/packages/firebase_ui_storage/lib/src/widgets/grid_view.dart +++ b/packages/firebase_ui_storage/lib/src/widgets/grid_view.dart @@ -67,7 +67,8 @@ class StorageGridView extends StatefulWidget { BuildContext context, Object? error, PaginatedLoadingController controller, - )? errorBuilder; + )? + errorBuilder; /// A builder that is called for each item in the list. final Widget Function(BuildContext context, Reference ref) itemBuilder; @@ -87,20 +88,18 @@ class StorageGridView extends StatefulWidget { ), required this.itemBuilder, }) : assert( - ref != null || loadingController != null, - 'ref or loadingController must be provided', - ); + ref != null || loadingController != null, + 'ref or loadingController must be provided', + ); @override State createState() => _StorageGridViewState(); } class _StorageGridViewState extends State { - late PaginatedLoadingController ctrl = widget.loadingController ?? - PaginatedLoadingController( - ref: widget.ref!, - pageSize: widget.pageSize, - ); + late PaginatedLoadingController ctrl = + widget.loadingController ?? + PaginatedLoadingController(ref: widget.ref!, pageSize: widget.pageSize); Widget gridBuilder(BuildContext context, List items) { return GridView.builder( @@ -123,10 +122,7 @@ class _StorageGridViewState extends State { builder: (context, _) { return switch (ctrl.state) { InitialPageLoading() => widget.loadingBuilder(context), - PageLoadError( - error: final error, - items: final items, - ) => + PageLoadError(error: final error, items: final items) => widget.errorBuilder != null ? widget.errorBuilder!(context, error, ctrl) : gridBuilder(context, items ?? []), diff --git a/packages/firebase_ui_storage/lib/src/widgets/image.dart b/packages/firebase_ui_storage/lib/src/widgets/image.dart index bf0b64700..467a0ccfe 100644 --- a/packages/firebase_ui_storage/lib/src/widgets/image.dart +++ b/packages/firebase_ui_storage/lib/src/widgets/image.dart @@ -19,9 +19,9 @@ abstract class LoadingStateVariant { /// {@macro ui.storage.image.loadingStateVariant.animationDuration} Duration? animationDuration, - }) : animationDuration = - animationDuration ?? const Duration(milliseconds: 1000), - curve = curve ?? Curves.easeOutExpo; + }) : animationDuration = + animationDuration ?? const Duration(milliseconds: 1000), + curve = curve ?? Curves.easeOutExpo; /// A solid color placeholder. factory LoadingStateVariant.solidColor({ @@ -109,9 +109,9 @@ class _LoadingIndicatorLoadingStateVariant extends LoadingStateVariant { this.strokeWidth = 2, this.color, }) : super( - curve: Curves.easeOutExpo, - animationDuration: const Duration(milliseconds: 1000), - ); + curve: Curves.easeOutExpo, + animationDuration: const Duration(milliseconds: 1000), + ); } class _ShimmerLoadingStateVariant extends LoadingStateVariant { @@ -138,7 +138,8 @@ class StorageImage extends StatefulWidget { BuildContext context, Object error, [ StackTrace? stackTrace, - ])? errorBuilder; + ])? + errorBuilder; /// See [NetworkImage.scale] final double scale; @@ -249,11 +250,9 @@ class _StorageImageState extends State ) : null; - late final Animation opacity = widget.opacity ?? - CurvedAnimation( - parent: ctrl!, - curve: loadingStateVariant.curve, - ); + late final Animation opacity = + widget.opacity ?? + CurvedAnimation(parent: ctrl!, curve: loadingStateVariant.curve); void maybeAnimate() { if (ctrl == null) return; @@ -319,9 +318,8 @@ class _StorageImageState extends State } if (loadingStateVariant is _ShimmerLoadingStateVariant) { - final _ShimmerLoadingStateVariant( - :initialProgress, - ) = loadingStateVariant as _ShimmerLoadingStateVariant; + final _ShimmerLoadingStateVariant(:initialProgress) = + loadingStateVariant as _ShimmerLoadingStateVariant; final placeholder = _ShimmerLoadingStateVariantPlaceholder( key: placeholderKey, @@ -363,8 +361,10 @@ class _StorageImageState extends State future: downloadUrlFuture, builder: (context, snapshot) { if (snapshot.hasError) { - final customError = - widget.errorBuilder?.call(context, snapshot.error!); + final customError = widget.errorBuilder?.call( + context, + snapshot.error!, + ); return customError ?? const SizedBox.shrink(); } @@ -449,10 +449,7 @@ class _SolidColorLoadingStateVariantPlaceholder extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - color: resolveLoadingColor(context), - child: child, - ); + return Container(color: resolveLoadingColor(context), child: child); } } @@ -487,9 +484,9 @@ class _BlurHashLoadingStateVariantPlaceholderState FutureOr loadHash() async { if (widget.value != null) return widget.value; - return widget.ref - .getMetadata() - .then((value) => value.customMetadata?['blurHash']); + return widget.ref.getMetadata().then( + (value) => value.customMetadata?['blurHash'], + ); } Widget buildContent(String hash) { @@ -580,16 +577,10 @@ class __ShimmerLoadingStateVariantPlaceholderState late final animation = Tween( begin: 0.0, end: 1.0, - ).animate(CurvedAnimation( - parent: ctrl, - curve: widget.curve, - )); + ).animate(CurvedAnimation(parent: ctrl, curve: widget.curve)); Alignment getAlignment(double animationProgress) { - return Alignment( - -2 + animationProgress * 4, - -2 + animationProgress * 4, - ); + return Alignment(-2 + animationProgress * 4, -2 + animationProgress * 4); } @override @@ -622,11 +613,7 @@ class __ShimmerLoadingStateVariantPlaceholderState return Container( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - darker, - lighter, - darker, - ], + colors: [darker, lighter, darker], stops: const [0.0, 0.5, 1.0], begin: getAlignment(animation.value), end: alignment + const Alignment(1, 1), diff --git a/packages/firebase_ui_storage/lib/src/widgets/list_view.dart b/packages/firebase_ui_storage/lib/src/widgets/list_view.dart index 8bea6aae8..d96a006f1 100644 --- a/packages/firebase_ui_storage/lib/src/widgets/list_view.dart +++ b/packages/firebase_ui_storage/lib/src/widgets/list_view.dart @@ -64,7 +64,8 @@ class StorageListView extends StatefulWidget { BuildContext context, Object? error, PaginatedLoadingController controller, - )? errorBuilder; + )? + errorBuilder; /// A builder that is called for each item in the list. final Widget Function(BuildContext context, Reference ref) itemBuilder; @@ -161,20 +162,18 @@ class StorageListView extends StatefulWidget { this.semanticChildCount, this.shrinkWrap = false, }) : assert( - ref != null || loadingController != null, - 'ref or loadingController must be provided', - ); + ref != null || loadingController != null, + 'ref or loadingController must be provided', + ); @override State createState() => _StorageListViewState(); } class _StorageListViewState extends State { - late PaginatedLoadingController ctrl = widget.loadingController ?? - PaginatedLoadingController( - ref: widget.ref!, - pageSize: widget.pageSize, - ); + late PaginatedLoadingController ctrl = + widget.loadingController ?? + PaginatedLoadingController(ref: widget.ref!, pageSize: widget.pageSize); @override void didUpdateWidget(covariant StorageListView oldWidget) { @@ -232,10 +231,7 @@ class _StorageListViewState extends State { builder: (context, _) { return switch (ctrl.state) { InitialPageLoading() => widget.loadingBuilder(context), - PageLoadError( - error: final error, - items: final items, - ) => + PageLoadError(error: final error, items: final items) => widget.errorBuilder != null ? widget.errorBuilder!(context, error, ctrl) : listBuilder(context, items ?? []), diff --git a/packages/firebase_ui_storage/lib/src/widgets/progress_indicator.dart b/packages/firebase_ui_storage/lib/src/widgets/progress_indicator.dart index 30940bb35..08d3feb24 100644 --- a/packages/firebase_ui_storage/lib/src/widgets/progress_indicator.dart +++ b/packages/firebase_ui_storage/lib/src/widgets/progress_indicator.dart @@ -8,16 +8,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// A builder that is invoked for each progress event. -typedef TaskProgressBuilder = Widget Function( - BuildContext context, - double progress, -); +typedef TaskProgressBuilder = + Widget Function(BuildContext context, double progress); /// A builder that is invoked when an error occurs. -typedef ErrorBuilder = Widget Function( - BuildContext context, - Object? error, -); +typedef ErrorBuilder = Widget Function(BuildContext context, Object? error); class _BindTaskWidget extends StatelessWidget { final Task task; diff --git a/packages/firebase_ui_storage/pubspec.yaml b/packages/firebase_ui_storage/pubspec.yaml index f942b3782..dce86c833 100644 --- a/packages/firebase_ui_storage/pubspec.yaml +++ b/packages/firebase_ui_storage/pubspec.yaml @@ -4,7 +4,7 @@ version: 3.0.1 homepage: https://github.com/firebase/FirebaseUI-Flutter/tree/master/packages/firebase_ui_storage/ environment: - sdk: ^3.5.0 + sdk: ^3.9.0 flutter: ">=3.10.0" resolution: workspace diff --git a/packages/firebase_ui_storage/test/config_test.dart b/packages/firebase_ui_storage/test/config_test.dart index 63ca6d71f..231856f69 100644 --- a/packages/firebase_ui_storage/test/config_test.dart +++ b/packages/firebase_ui_storage/test/config_test.dart @@ -46,36 +46,37 @@ void main() { }); group('FirebaseUIStorageConfigOverride', () { - testWidgets( - 'allows to override a top-level configuration', - (tester) async { - final initialConfig = FirebaseUIStorageConfiguration( - storage: MockStorage.instance, - ); + testWidgets('allows to override a top-level configuration', (tester) async { + final initialConfig = FirebaseUIStorageConfiguration( + storage: MockStorage.instance, + ); - final overriden = FirebaseUIStorageConfiguration( - storage: MockStorage.instance, - namingPolicy: const UuidFileUploadNamingPolicy(), - ); + final overriden = FirebaseUIStorageConfiguration( + storage: MockStorage.instance, + namingPolicy: const UuidFileUploadNamingPolicy(), + ); - FirebaseUIStorage.configure(initialConfig); + FirebaseUIStorage.configure(initialConfig); - await tester.pumpWidget( - Builder(builder: (context) { + await tester.pumpWidget( + Builder( + builder: (context) { final config = context.configFor(MockStorage.instance); expect(config, initialConfig); return FirebaseUIStorageConfigOverride( config: overriden, - child: Builder(builder: (context) { - final config = context.configFor(MockStorage.instance); - expect(config, overriden); - return const SizedBox(); - }), + child: Builder( + builder: (context) { + final config = context.configFor(MockStorage.instance); + expect(config, overriden); + return const SizedBox(); + }, + ), ); - }), - ); - }, - ); + }, + ), + ); + }); }); } diff --git a/packages/firebase_ui_storage/test/firebase_ui_storage_test.dart b/packages/firebase_ui_storage/test/firebase_ui_storage_test.dart index 39143bed7..7e4ed041d 100644 --- a/packages/firebase_ui_storage/test/firebase_ui_storage_test.dart +++ b/packages/firebase_ui_storage/test/firebase_ui_storage_test.dart @@ -26,16 +26,13 @@ void main() { }, ); - test( - 'throws an error if already configured', - () async { - await FirebaseUIStorage.configure(config); - expect( - () => FirebaseUIStorage.configure(config), - throwsA(isA()), - ); - }, - ); + test('throws an error if already configured', () async { + await FirebaseUIStorage.configure(config); + expect( + () => FirebaseUIStorage.configure(config), + throwsA(isA()), + ); + }); }); group('configurationFor()', () { @@ -47,34 +44,25 @@ void main() { }, ); - test( - 'throws an error if not configured', - () async { - expect( - () => FirebaseUIStorage.configurationFor(config.storage), - throwsA(isA()), - ); - }, - ); + test('throws an error if not configured', () async { + expect( + () => FirebaseUIStorage.configurationFor(config.storage), + throwsA(isA()), + ); + }); }); group('isConfigured()', () { - test( - 'returns true if a configuration is set for a given FirebaseStorage ' - 'instance', - () async { - await FirebaseUIStorage.configure(config); - expect(FirebaseUIStorage.isConfigured(storage), isTrue); - }, - ); + test('returns true if a configuration is set for a given FirebaseStorage ' + 'instance', () async { + await FirebaseUIStorage.configure(config); + expect(FirebaseUIStorage.isConfigured(storage), isTrue); + }); - test( - 'returns false if a configuration is not set for a given ' - 'FirebaseStorage instance', - () async { - expect(FirebaseUIStorage.isConfigured(storage), isFalse); - }, - ); + test('returns false if a configuration is not set for a given ' + 'FirebaseStorage instance', () async { + expect(FirebaseUIStorage.isConfigured(storage), isFalse); + }); }); }); } diff --git a/pubspec.yaml b/pubspec.yaml index 1f74d9c12..c5079f786 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: firebase_ui_workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 workspace: - packages/firebase_ui_auth diff --git a/scripts/update_dependencies.dart b/scripts/update_dependencies.dart index 863a4f3c1..b8999ccc5 100644 --- a/scripts/update_dependencies.dart +++ b/scripts/update_dependencies.dart @@ -32,17 +32,9 @@ Future main(List args) async { listOfFutures.add(future); } + listOfFutures.add(updatePodfileVersion(iosSdkVersion, './tests/ios/Podfile')); listOfFutures.add( - updatePodfileVersion( - iosSdkVersion, - './tests/ios/Podfile', - ), - ); - listOfFutures.add( - updatePodfileVersion( - iosSdkVersion, - './tests/macos/Podfile', - ), + updatePodfileVersion(iosSdkVersion, './tests/macos/Podfile'), ); await Future.wait(listOfFutures); @@ -77,7 +69,7 @@ List findPubspecFiles(Directory root) { final pubspecFiles = []; final directories = [ Directory(p.join(root.path, 'packages')), - Directory(p.join(root.path, 'tests')) + Directory(p.join(root.path, 'tests')), ]; for (final dir in directories) { @@ -109,7 +101,8 @@ Future updatePodfileVersion( final updatedContent = content.replaceAllMapped( RegExp( - r"pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '\d+\.\d+\.\d+'"), + r"pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '\d+\.\d+\.\d+'", + ), (match) => "pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '$iosSdkVersion'", ); @@ -117,5 +110,6 @@ Future updatePodfileVersion( await podfile.writeAsString(updatedContent); print( - 'Updated Podfile Firestore framework on path: $podfilePath to version: $iosSdkVersion'); + 'Updated Podfile Firestore framework on path: $podfilePath to version: $iosSdkVersion', + ); } diff --git a/tests/integration_test/firebase_ui_auth/actions_test.dart b/tests/integration_test/firebase_ui_auth/actions_test.dart index d7d9c774f..4ce261eaa 100644 --- a/tests/integration_test/firebase_ui_auth/actions_test.dart +++ b/tests/integration_test/firebase_ui_auth/actions_test.dart @@ -11,54 +11,53 @@ import '../utils.dart'; void main() { setUpTests(); - group( - 'getControllerForType', - () { - setUp(() async { - await auth.createUserWithEmailAndPassword( - email: 'test@test.com', - password: '123456', - ); - }); + group('getControllerForType', () { + setUp(() async { + await auth.createUserWithEmailAndPassword( + email: 'test@test.com', + password: '123456', + ); + }); - Future authenticate(WidgetTester tester) async { - final inputs = find.byType(TextFormField); + Future authenticate(WidgetTester tester) async { + final inputs = find.byType(TextFormField); - await tester.enterText(inputs.at(0), 'test@test.com'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); + await tester.enterText(inputs.at(0), 'test@test.com'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); - await tester.enterText(inputs.at(1), '123456'); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - } + await tester.enterText(inputs.at(1), '123456'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + } - testWidgets( - 'getControllerForState returns correct controller type', - (tester) async { - late AuthController controller; + testWidgets( + 'getControllerForState returns correct controller type', + (tester) async { + late AuthController controller; - await render( - tester, - FirebaseUIActions( - actions: [ - AuthStateChangeAction((context, state) { - controller = getControllerForState(state); - }) - ], - child: const EmailForm(action: AuthAction.signIn), - ), - ); + await render( + tester, + FirebaseUIActions( + actions: [ + AuthStateChangeAction((context, state) { + controller = getControllerForState(state); + }), + ], + child: const EmailForm(action: AuthAction.signIn), + ), + ); - await authenticate(tester); + await authenticate(tester); - expect(controller, isA()); - }, - skip: isCI && defaultTargetPlatform == TargetPlatform.macOS, - ); + expect(controller, isA()); + }, + skip: isCI && defaultTargetPlatform == TargetPlatform.macOS, + ); - testWidgets('throws a StateError if used outside of the FirebaseUIAction', - (tester) async { + testWidgets( + 'throws a StateError if used outside of the FirebaseUIAction', + (tester) async { late AuthState state; await render( @@ -75,7 +74,8 @@ void main() { await authenticate(tester); expect(() => getControllerForState(state), throwsStateError); - }, skip: isCI && defaultTargetPlatform == TargetPlatform.macOS); - }, - ); + }, + skip: isCI && defaultTargetPlatform == TargetPlatform.macOS, + ); + }); } diff --git a/tests/integration_test/firebase_ui_auth/email_form_test.dart b/tests/integration_test/firebase_ui_auth/email_form_test.dart index 09a409595..e679fb8eb 100644 --- a/tests/integration_test/firebase_ui_auth/email_form_test.dart +++ b/tests/integration_test/firebase_ui_auth/email_form_test.dart @@ -39,7 +39,8 @@ void main() { expect(auth.currentUser, isNotNull); }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.android), ); @@ -89,7 +90,7 @@ void main() { expect(state, isA()); expect(state.user, isNotNull); expect(state.user!.email, equals('test@test.com')); - }) + }), ], child: const EmailForm(action: AuthAction.signIn), ), @@ -105,7 +106,8 @@ void main() { await tester.pumpAndSettle(); }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.android), ); @@ -113,10 +115,7 @@ void main() { testWidgets( 'links email and password when auth action is link', (tester) async { - await render( - tester, - const EmailForm(action: AuthAction.link), - ); + await render(tester, const EmailForm(action: AuthAction.link)); await auth.signInAnonymously(); final anonymousUid = auth.currentUser!.uid; diff --git a/tests/integration_test/firebase_ui_auth/email_link_sign_in_view_test.dart b/tests/integration_test/firebase_ui_auth/email_link_sign_in_view_test.dart index cb4a8607b..6920014ec 100644 --- a/tests/integration_test/firebase_ui_auth/email_link_sign_in_view_test.dart +++ b/tests/integration_test/firebase_ui_auth/email_link_sign_in_view_test.dart @@ -27,10 +27,7 @@ void main() { group('EmailLinkSignInView', () { testWidgets('validates email', (tester) async { - await render( - tester, - EmailLinkSignInView(provider: emailLinkProvider), - ); + await render(tester, EmailLinkSignInView(provider: emailLinkProvider)); final input = find.byType(TextFormField); await tester.enterText(input, 'notanemail'); @@ -42,12 +39,7 @@ void main() { }); testWidgets('sends a link to an email', (tester) async { - await render( - tester, - EmailLinkSignInView( - provider: emailLinkProvider, - ), - ); + await render(tester, EmailLinkSignInView(provider: emailLinkProvider)); final input = find.byType(TextFormField); await tester.enterText(input, 'test@test.com'); diff --git a/tests/integration_test/firebase_ui_auth/layout_test.dart b/tests/integration_test/firebase_ui_auth/layout_test.dart index 8b05dcf3f..10d0d58ea 100644 --- a/tests/integration_test/firebase_ui_auth/layout_test.dart +++ b/tests/integration_test/firebase_ui_auth/layout_test.dart @@ -12,47 +12,42 @@ import 'package:mockito/mockito.dart'; void main() { group('Reauthenticate dialog', () { - testWidgets( - "doesn't have an overflow when keyboard is visible", - (tester) async { - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: ReauthenticateDialog( - providers: [ - EmailAuthProvider(), - PhoneAuthProvider(), - GoogleProvider(clientId: 'mock'), - AppleProvider(), - ], - auth: MockAuth(), - ), + testWidgets("doesn't have an overflow when keyboard is visible", ( + tester, + ) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ReauthenticateDialog( + providers: [ + EmailAuthProvider(), + PhoneAuthProvider(), + GoogleProvider(clientId: 'mock'), + AppleProvider(), + ], + auth: MockAuth(), ), ), - ); + ), + ); - // Triggers keyboard to appear - await tester.tap(find.byType(TextFormField).first); + // Triggers keyboard to appear + await tester.tap(find.byType(TextFormField).first); - // Waits for keyboard to appear - await tester.pumpAndSettle(); + // Waits for keyboard to appear + await tester.pumpAndSettle(); - // No need for an expect. - // Test will fail if there is an overflow. - // This is a built-in flutter functionality + // No need for an expect. + // Test will fail if there is an overflow. + // This is a built-in flutter functionality - await tester.tap(find.text('Cancel')); - await tester.pumpAndSettle(); - }, - ); + await tester.tap(find.text('Cancel')); + await tester.pumpAndSettle(); + }); }); } -const _user = { - 'uid': 'uid', - 'isAnonymous': false, - 'isEmailVerified': false, -}; +const _user = {'uid': 'uid', 'isAnonymous': false, 'isEmailVerified': false}; class MockUser extends Mock implements fba.User { @override @@ -61,7 +56,7 @@ class MockUser extends Mock implements fba.User { fba.UserInfo.fromJson({..._user, 'providerId': 'password'}), fba.UserInfo.fromJson({..._user, 'providerId': 'google.com'}), fba.UserInfo.fromJson({..._user, 'providerId': 'apple.com'}), - fba.UserInfo.fromJson({..._user, 'providerId': 'phone'}) + fba.UserInfo.fromJson({..._user, 'providerId': 'phone'}), ]; } } diff --git a/tests/integration_test/firebase_ui_auth/phone_verification_test.dart b/tests/integration_test/firebase_ui_auth/phone_verification_test.dart index d0cdbd0c3..a174b6afa 100644 --- a/tests/integration_test/firebase_ui_auth/phone_verification_test.dart +++ b/tests/integration_test/firebase_ui_auth/phone_verification_test.dart @@ -60,10 +60,7 @@ void main() { }); testWidgets('validates phone number', (tester) async { - await render( - tester, - const PhoneInputScreen(), - ); + await render(tester, const PhoneInputScreen()); await tester.pump(); @@ -77,43 +74,41 @@ void main() { expect(errorText, findsOneWidget); }); - testWidgets( - 'sends sms verification code when next is clicked', - (tester) async { - final completer = Completer(); + testWidgets('sends sms verification code when next is clicked', ( + tester, + ) async { + final completer = Completer(); - await render( - tester, - PhoneInputScreen( - actions: [ - AuthStateChangeAction((context, state) { - completer.complete(); - }), - AuthStateChangeAction((context, state) { - fail('should not fail'); - }), - ], - ), - ); + await render( + tester, + PhoneInputScreen( + actions: [ + AuthStateChangeAction((context, state) { + completer.complete(); + }), + AuthStateChangeAction((context, state) { + fail('should not fail'); + }), + ], + ), + ); - await sendSMS(tester, '555555555'); + await sendSMS(tester, '555555555'); - await completer.future; + await completer.future; - final code = await getVerificationCode('+1555555555'); - expect(code, isNotEmpty); - }, - ); + final code = await getVerificationCode('+1555555555'); + expect(code, isNotEmpty); + }); - testWidgets( - 'opens sms verification screen when code is requested', - (tester) async { - await render(tester, const PhoneInputScreen()); - await sendSMS(tester, '123456789'); + testWidgets('opens sms verification screen when code is requested', ( + tester, + ) async { + await render(tester, const PhoneInputScreen()); + await sendSMS(tester, '123456789'); - expect(find.text(labels.enterSMSCodeText), findsOneWidget); - }, - ); + expect(find.text(labels.enterSMSCodeText), findsOneWidget); + }); }); group('SMSCodeInputScreen', () { @@ -129,86 +124,83 @@ void main() { expect(find.byType(PhoneInputScreen), findsOneWidget); }); - testWidgets( - 'shows error message if invalid code was entered', - (tester) async { - final completer = Completer(); + testWidgets('shows error message if invalid code was entered', ( + tester, + ) async { + final completer = Completer(); - await render( - tester, - AuthStateListener( - listener: (oldState, newState, _) { - if (newState is! AuthFailed) return; - completer.complete(); + await render( + tester, + AuthStateListener( + listener: (oldState, newState, _) { + if (newState is! AuthFailed) return; + completer.complete(); - return null; - }, - child: const PhoneInputScreen(), - ), - ); - await sendSMS(tester, '555555556'); + return null; + }, + child: const PhoneInputScreen(), + ), + ); + await sendSMS(tester, '555555556'); - final smsCodeInput = find.byType(SMSCodeInput); - expect(smsCodeInput, findsOneWidget); + final smsCodeInput = find.byType(SMSCodeInput); + expect(smsCodeInput, findsOneWidget); - final code = await getVerificationCode('+1555555556'); - final invalidCode = - code.split('').map(int.parse).map((v) => (v + 1) % 10).join(); + final code = await getVerificationCode('+1555555556'); + final invalidCode = code + .split('') + .map(int.parse) + .map((v) => (v + 1) % 10) + .join(); - await tester.tap(smsCodeInput); + await tester.tap(smsCodeInput); - await tester.enterText(smsCodeInput, invalidCode); - await tester.pumpAndSettle(); - await tester.testTextInput.receiveAction(TextInputAction.done); - await completer.future; + await tester.enterText(smsCodeInput, invalidCode); + await tester.pumpAndSettle(); + await tester.testTextInput.receiveAction(TextInputAction.done); + await completer.future; - await tester.pump(); + await tester.pump(); - expect(find.byType(ErrorText), findsOneWidget); - expect( - find.text(labels.invalidVerificationCodeErrorText), - findsOneWidget, - ); - }, - ); + expect(find.byType(ErrorText), findsOneWidget); + expect( + find.text(labels.invalidVerificationCodeErrorText), + findsOneWidget, + ); + }); - testWidgets( - 'signs in if the code is correct', - (tester) async { - final completer = Completer(); + testWidgets('signs in if the code is correct', (tester) async { + final completer = Completer(); - await render( - tester, - FirebaseUIActions( - actions: [ - AuthStateChangeAction((context, state) { - completer.complete(state.credential.user!); - }), - AuthStateChangeAction((context, state) { - fail("shouldn't fail"); - }), - ], - child: const PhoneInputScreen(), - ), - ); - await sendSMS(tester, '555555557'); + await render( + tester, + FirebaseUIActions( + actions: [ + AuthStateChangeAction((context, state) { + completer.complete(state.credential.user!); + }), + AuthStateChangeAction((context, state) { + fail("shouldn't fail"); + }), + ], + child: const PhoneInputScreen(), + ), + ); + await sendSMS(tester, '555555557'); - final smsCodeInput = find.byType(SMSCodeInput); - final code = await getVerificationCode('+1555555557'); + final smsCodeInput = find.byType(SMSCodeInput); + final code = await getVerificationCode('+1555555557'); - await tester.tap(smsCodeInput); + await tester.tap(smsCodeInput); - await tester.enterText(smsCodeInput, code); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); + await tester.enterText(smsCodeInput, code); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); - final user = await completer.future.timeout( - const Duration(seconds: 10), - ); + final user = await completer.future.timeout(const Duration(seconds: 10)); - expect(user.phoneNumber, '+1555555557'); - }, - ); + expect(user.phoneNumber, '+1555555557'); + }); }); group('showReauthenticateDialog', () { @@ -245,19 +237,21 @@ void main() { await render( tester, - Builder(builder: (context) { - return ElevatedButton( - onPressed: () { - showReauthenticateDialog( - context: context, - providers: [PhoneAuthProvider()], - onSignedIn: () => reauthenticationCompleter.complete(), - onPhoneVerfifed: () => onPhoneVerifiedCalled = true, - ); - }, - child: const Text('Reauthenticate'), - ); - }), + Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showReauthenticateDialog( + context: context, + providers: [PhoneAuthProvider()], + onSignedIn: () => reauthenticationCompleter.complete(), + onPhoneVerfifed: () => onPhoneVerifiedCalled = true, + ); + }, + child: const Text('Reauthenticate'), + ); + }, + ), ); await tester.tap(find.byType(ElevatedButton)); @@ -284,7 +278,8 @@ void main() { expect(onPhoneVerifiedCalled, isTrue); }, // passes locally but fails in CI - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS), ); diff --git a/tests/integration_test/firebase_ui_database/database_list_view_test.dart b/tests/integration_test/firebase_ui_database/database_list_view_test.dart index 0bd0e12af..1ed5a37f5 100644 --- a/tests/integration_test/firebase_ui_database/database_list_view_test.dart +++ b/tests/integration_test/firebase_ui_database/database_list_view_test.dart @@ -15,9 +15,7 @@ const _kTestPath = 'flutter-tests'; void main() { group('DatabaseListViewBuilder', () { setUp(() async { - await clearReference( - rtdb.ref(_kTestPath), - ); + await clearReference(rtdb.ref(_kTestPath)); }); testWidgets( @@ -57,7 +55,8 @@ void main() { expect(find.byType(ListView), findsNothing); }, // Works locally but fails on CI - skip: defaultTargetPlatform == TargetPlatform.iOS || + skip: + defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS, ); @@ -82,7 +81,8 @@ void main() { expect(find.byType(CircularProgressIndicator), findsNothing); expect(find.byType(ListView), findsNothing); }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS), ); @@ -106,7 +106,8 @@ void main() { expect(find.byType(CircularProgressIndicator), findsOneWidget); expect(find.byType(ListView), findsNothing); }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS), ); @@ -140,7 +141,8 @@ void main() { expect(find.byType(ListView), findsOneWidget); }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS), ); @@ -156,32 +158,31 @@ void main() { await tester.pumpWidget( MaterialApp( home: Material( - child: Builder(builder: (context) { - final mq = MediaQuery.of(context); - final h = mq.size.height; - size = h / 5; - - return FirebaseDatabaseListView( - physics: const ClampingScrollPhysics(), - query: ref.orderByValue(), - cacheExtent: 0, - pageSize: 5, - itemExtent: size, - itemBuilder: (context, snapshot) { - final v = snapshot.value as int; - - return Container( - alignment: Alignment.center, - color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), - key: ValueKey(v.toString()), - child: Text( - v.toString(), - textAlign: TextAlign.center, - ), - ); - }, - ); - }), + child: Builder( + builder: (context) { + final mq = MediaQuery.of(context); + final h = mq.size.height; + size = h / 5; + + return FirebaseDatabaseListView( + physics: const ClampingScrollPhysics(), + query: ref.orderByValue(), + cacheExtent: 0, + pageSize: 5, + itemExtent: size, + itemBuilder: (context, snapshot) { + final v = snapshot.value as int; + + return Container( + alignment: Alignment.center, + color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), + key: ValueKey(v.toString()), + child: Text(v.toString(), textAlign: TextAlign.center), + ); + }, + ); + }, + ), ), ), ); @@ -222,7 +223,8 @@ void main() { expect(find.byKey(ValueKey(i.toString())), findsOneWidget); } }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS), @@ -239,33 +241,32 @@ void main() { await tester.pumpWidget( MaterialApp( home: Material( - child: Builder(builder: (context) { - final mq = MediaQuery.of(context); - final h = mq.size.height; - size = h / 5; - - return FirebaseDatabaseListView( - physics: const ClampingScrollPhysics(), - query: ref.orderByValue(), - reverseQuery: true, - cacheExtent: 0, - pageSize: 5, - itemExtent: size, - itemBuilder: (context, snapshot) { - final v = snapshot.value as int; - - return Container( - alignment: Alignment.center, - color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), - key: ValueKey(v.toString()), - child: Text( - v.toString(), - textAlign: TextAlign.center, - ), - ); - }, - ); - }), + child: Builder( + builder: (context) { + final mq = MediaQuery.of(context); + final h = mq.size.height; + size = h / 5; + + return FirebaseDatabaseListView( + physics: const ClampingScrollPhysics(), + query: ref.orderByValue(), + reverseQuery: true, + cacheExtent: 0, + pageSize: 5, + itemExtent: size, + itemBuilder: (context, snapshot) { + final v = snapshot.value as int; + + return Container( + alignment: Alignment.center, + color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), + key: ValueKey(v.toString()), + child: Text(v.toString(), textAlign: TextAlign.center), + ); + }, + ); + }, + ), ), ), ); @@ -276,7 +277,8 @@ void main() { expect(find.byKey(ValueKey(i.toString())), findsOneWidget); } }, - skip: isCI && + skip: + isCI && (defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS), ); @@ -284,10 +286,7 @@ void main() { } class ListViewBuilderSpy extends Mock { - Widget call( - BuildContext? context, - T? snapshot, - ) { + Widget call(BuildContext? context, T? snapshot) { return super.noSuchMethod( Invocation.method(#call, [context, snapshot]), returnValueForMissingStub: Container(), @@ -297,7 +296,5 @@ class ListViewBuilderSpy extends Mock { } Future fillReference(DatabaseReference ref, int length) { - return Future.wait([ - for (var i = 0; i < length; i++) ref.push().set(i), - ]); + return Future.wait([for (var i = 0; i < length; i++) ref.push().set(i)]); } diff --git a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart index 392748f15..876fa4275 100644 --- a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart +++ b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart @@ -72,28 +72,25 @@ void main() { expect(find.byType(ListView), findsNothing); }); - testWidgets( - 'By default, shows a progress indicator when loading', - (tester) async { - final collection = db.collection( - 'flutter-tests/list-view-builder/works', - ); + testWidgets('By default, shows a progress indicator when loading', ( + tester, + ) async { + final collection = db.collection('flutter-tests/list-view-builder/works'); - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: FirestoreListView( - query: collection.orderBy('value'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), - ), + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FirestoreListView( + query: collection.orderBy('value'), + itemBuilder: (context, snapshot) => throw UnimplementedError(), ), ), - ); + ), + ); - expect(find.byType(CircularProgressIndicator), findsOneWidget); - expect(find.byType(ListView), findsNothing); - }, - ); + expect(find.byType(CircularProgressIndicator), findsOneWidget); + expect(find.byType(ListView), findsNothing); + }); testWidgets('By default, ignore errors', (tester) async { final builderSpy = ListViewBuilderSpy(); @@ -133,32 +130,31 @@ void main() { await tester.pumpWidget( MaterialApp( home: Material( - child: Builder(builder: (context) { - final mq = MediaQuery.of(context); - final h = mq.size.height; - size = h / 5; - - return FirestoreListView( - physics: const ClampingScrollPhysics(), - query: ref.orderBy('value'), - cacheExtent: 0, - pageSize: 5, - itemExtent: size, - itemBuilder: (context, snapshot) { - final v = snapshot.data()['value'] as int; - - return Container( - alignment: Alignment.center, - color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), - key: ValueKey(v.toString()), - child: Text( - v.toString(), - textAlign: TextAlign.center, - ), - ); - }, - ); - }), + child: Builder( + builder: (context) { + final mq = MediaQuery.of(context); + final h = mq.size.height; + size = h / 5; + + return FirestoreListView( + physics: const ClampingScrollPhysics(), + query: ref.orderBy('value'), + cacheExtent: 0, + pageSize: 5, + itemExtent: size, + itemBuilder: (context, snapshot) { + final v = snapshot.data()['value'] as int; + + return Container( + alignment: Alignment.center, + color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), + key: ValueKey(v.toString()), + child: Text(v.toString(), textAlign: TextAlign.center), + ); + }, + ); + }, + ), ), ), ); @@ -205,10 +201,7 @@ void main() { } class ListViewBuilderSpy extends Mock { - Widget call( - BuildContext? context, - T? snapshot, - ) { + Widget call(BuildContext? context, T? snapshot) { return super.noSuchMethod( Invocation.method(#call, [context, snapshot]), returnValueForMissingStub: Container(), diff --git a/tests/integration_test/firebase_ui_firestore/firestore_query_builder_test.dart b/tests/integration_test/firebase_ui_firestore/firestore_query_builder_test.dart index f8c397b2d..e9390ed98 100644 --- a/tests/integration_test/firebase_ui_firestore/firestore_query_builder_test.dart +++ b/tests/integration_test/firebase_ui_firestore/firestore_query_builder_test.dart @@ -12,9 +12,7 @@ import '../utils.dart'; void main() { group('FirestoreQueryBuilder', () { setUp(() async { - await clearCollection( - db.collection('flutter-tests/query-builder/works'), - ); + await clearCollection(db.collection('flutter-tests/query-builder/works')); }); testWidgets('fetches initial page', (tester) async { @@ -262,142 +260,139 @@ void main() { ); }); - testWidgets( - 'when the query changes, re-fetches from first page', - (tester) async { - final builderSpy = QueryBuilderSpy(); - final collection = db.collection('flutter-tests/query-builder/works'); + testWidgets('when the query changes, re-fetches from first page', ( + tester, + ) async { + final builderSpy = QueryBuilderSpy(); + final collection = db.collection('flutter-tests/query-builder/works'); - await fillCollection(collection, 25); + await fillCollection(collection, 25); - await tester.pumpWidget( - FirestoreQueryBuilder( - query: collection.orderBy('value'), - builder: builderSpy.call, - ), - ); + await tester.pumpWidget( + FirestoreQueryBuilder( + query: collection.orderBy('value'), + builder: builderSpy.call, + ), + ); - clearInteractions(builderSpy); + clearInteractions(builderSpy); - await collection.get(); - await tester.pump(); + await collection.get(); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: false, - hasData: true, - hasMore: true, - docs: [ - for (var i = 0; i < 10; i++) - isQueryDocumentSnapshot(data: {'value': i}), - ], - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: false, + hasData: true, + hasMore: true, + docs: [ + for (var i = 0; i < 10; i++) + isQueryDocumentSnapshot(data: {'value': i}), + ], + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - builderSpy.lastSnapshot!.fetchMore(); - await tester.pump(); + builderSpy.lastSnapshot!.fetchMore(); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot(isFetchingNextPage: true), - ), - null, - ), - ); - verifyNoMoreInteractions(builderSpy); + verify( + builderSpy( + any, + captureThat(isQueryBuilderSnapshot(isFetchingNextPage: true)), + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await collection.get(); - await tester.pump(); + await collection.get(); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: false, - hasData: true, - hasMore: true, - docs: [ - for (var i = 0; i < 20; i++) - isQueryDocumentSnapshot(data: {'value': i}), - ], - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: false, + hasData: true, + hasMore: true, + docs: [ + for (var i = 0; i < 20; i++) + isQueryDocumentSnapshot(data: {'value': i}), + ], + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await tester.pumpWidget( - FirestoreQueryBuilder( - query: collection.orderBy('value', descending: true), - builder: builderSpy.call, - ), - ); + await tester.pumpWidget( + FirestoreQueryBuilder( + query: collection.orderBy('value', descending: true), + builder: builderSpy.call, + ), + ); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: true, - hasData: true, - hasMore: true, - docs: [ - for (var i = 0; i < 20; i++) - isQueryDocumentSnapshot(data: {'value': i}), - ], - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: true, + hasData: true, + hasMore: true, + docs: [ + for (var i = 0; i < 20; i++) + isQueryDocumentSnapshot(data: {'value': i}), + ], + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await collection.get(); - await tester.pump(); + await collection.get(); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: false, - hasData: true, - hasMore: true, - docs: [ - for (var i = 0; i < 10; i++) - isQueryDocumentSnapshot(data: {'value': 24 - i}), - ], - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: false, + hasData: true, + hasMore: true, + docs: [ + for (var i = 0; i < 10; i++) + isQueryDocumentSnapshot(data: {'value': 24 - i}), + ], + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); - }, - ); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); + }); testWidgets( 'when the page size changes, re-fetches but preserve progress', @@ -447,9 +442,7 @@ void main() { verify( builderSpy( any, - captureThat( - isQueryBuilderSnapshot(isFetchingNextPage: true), - ), + captureThat(isQueryBuilderSnapshot(isFetchingNextPage: true)), null, ), ); @@ -730,121 +723,120 @@ void main() { verifyNoMoreInteractions(builderSpy); }); - testWidgets( - 'data after error resets hasError/error/stackTrace', - (tester) async { - final builderSpy = QueryBuilderSpy(); - final validCollection = db.collection( - 'flutter-tests/query-builder/works', - ); - final unknownCollection = db.collection('unknown'); + testWidgets('data after error resets hasError/error/stackTrace', ( + tester, + ) async { + final builderSpy = QueryBuilderSpy(); + final validCollection = db.collection( + 'flutter-tests/query-builder/works', + ); + final unknownCollection = db.collection('unknown'); - await fillCollection(validCollection, 25); + await fillCollection(validCollection, 25); - await tester.pumpWidget( - FirestoreQueryBuilder( - query: unknownCollection, - builder: builderSpy.call, - ), - ); + await tester.pumpWidget( + FirestoreQueryBuilder( + query: unknownCollection, + builder: builderSpy.call, + ), + ); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: true, - hasData: false, - hasMore: false, - hasError: false, - docs: [], - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: true, + hasData: false, + hasMore: false, + hasError: false, + docs: [], + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await unknownCollection.snapshots().first.then((_) {}, onError: (_) {}); - await tester.pump(); + await unknownCollection.snapshots().first.then((_) {}, onError: (_) {}); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: false, - isFetchingNextPage: false, - hasData: false, - hasMore: false, - docs: [], - hasError: true, - error: isA(), - stackTrace: isNotNull, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: false, + isFetchingNextPage: false, + hasData: false, + hasMore: false, + docs: [], + hasError: true, + error: isA(), + stackTrace: isNotNull, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await tester.pumpWidget( - FirestoreQueryBuilder( - query: validCollection.orderBy('value'), - builder: builderSpy.call, - ), - ); + await tester.pumpWidget( + FirestoreQueryBuilder( + query: validCollection.orderBy('value'), + builder: builderSpy.call, + ), + ); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: true, - isFetchingNextPage: false, - hasData: false, - hasMore: false, - docs: [], - hasError: true, - error: isA(), - stackTrace: isNotNull, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: true, + isFetchingNextPage: false, + hasData: false, + hasMore: false, + docs: [], + hasError: true, + error: isA(), + stackTrace: isNotNull, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); - await validCollection.get(); - await tester.pump(); + await validCollection.get(); + await tester.pump(); - verify( - builderSpy( - any, - captureThat( - isQueryBuilderSnapshot( - isFetching: false, - hasData: true, - hasMore: true, - docs: [ - for (var i = 0; i < 10; i++) - isQueryDocumentSnapshot(data: {'value': i}), - ], - hasError: false, - error: null, - stackTrace: null, - isFetchingNextPage: false, - ), + verify( + builderSpy( + any, + captureThat( + isQueryBuilderSnapshot( + isFetching: false, + hasData: true, + hasMore: true, + docs: [ + for (var i = 0; i < 10; i++) + isQueryDocumentSnapshot(data: {'value': i}), + ], + hasError: false, + error: null, + stackTrace: null, + isFetchingNextPage: false, ), - null, ), - ); - verifyNoMoreInteractions(builderSpy); - }, - ); + null, + ), + ); + verifyNoMoreInteractions(builderSpy); + }); }); } @@ -866,7 +858,8 @@ class QueryBuilderSpy extends Mock { BuildContext context, FirestoreQueryBuilderSnapshot snapshot, Widget? child, - )? _builder; + )? + _builder; FirestoreQueryBuilderSnapshot? lastSnapshot; diff --git a/tests/integration_test/firebase_ui_oauth_apple/apple_sign_in_test.dart b/tests/integration_test/firebase_ui_oauth_apple/apple_sign_in_test.dart index 12e87de0f..fc232b3e0 100644 --- a/tests/integration_test/firebase_ui_oauth_apple/apple_sign_in_test.dart +++ b/tests/integration_test/firebase_ui_oauth_apple/apple_sign_in_test.dart @@ -35,53 +35,40 @@ void main() async { testWidgets('has a correct button label', (tester) async { await render( tester, - OAuthProviderButton( - provider: provider, - auth: auth, - ), + OAuthProviderButton(provider: provider, auth: auth), ); expect(find.text(labels.signInWithAppleButtonText), findsOneWidget); }); - testWidgets( - 'calls sign in when tapped', - (tester) async { - await render( - tester, - OAuthProviderButton( - provider: provider, - auth: auth, - ), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - - await tester.pumpAndSettle(); - verify(auth.signInWithProvider(fbProvider)).called(1); - - expect(true, isTrue); - }, - ); - - testWidgets( - 'shows loading indicator when sign in is in progress', - (tester) async { - await render( - tester, - OAuthProviderButton( - provider: provider, - auth: auth, - ), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - ); + testWidgets('calls sign in when tapped', (tester) async { + await render( + tester, + OAuthProviderButton(provider: provider, auth: auth), + ); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + + await tester.pumpAndSettle(); + verify(auth.signInWithProvider(fbProvider)).called(1); + + expect(true, isTrue); + }); + + testWidgets('shows loading indicator when sign in is in progress', ( + tester, + ) async { + await render( + tester, + OAuthProviderButton(provider: provider, auth: auth), + ); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + await tester.pump(); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); testWidgets('signs the user in', (tester) async { final listener = MockListener(); @@ -93,10 +80,7 @@ void main() async { listener(state); return null; }, - child: OAuthProviderButton( - provider: provider, - auth: auth, - ), + child: OAuthProviderButton(provider: provider, auth: auth), ), ); @@ -130,14 +114,7 @@ void main() async { class MockListener extends Mock { void call(AuthState? state) { - super.noSuchMethod( - Invocation.method( - #call, - [ - state, - ], - ), - ); + super.noSuchMethod(Invocation.method(#call, [state])); } } @@ -163,13 +140,12 @@ class MockAuth extends Mock implements fba.FirebaseAuth { Future signInWithProvider(Object provider) async { return super.noSuchMethod( Invocation.method(#signInWithAuthProvider, [provider]), - returnValue: Future.delayed(const Duration(milliseconds: 500)).then( - (_) => MockCredential(), - ), - returnValueForMissingStub: - Future.delayed(const Duration(milliseconds: 500)).then( - (_) => MockCredential(), - ), + returnValue: Future.delayed( + const Duration(milliseconds: 500), + ).then((_) => MockCredential()), + returnValueForMissingStub: Future.delayed( + const Duration(milliseconds: 500), + ).then((_) => MockCredential()), ); } } diff --git a/tests/integration_test/firebase_ui_oauth_facebook/facebook_sign_in_test.dart b/tests/integration_test/firebase_ui_oauth_facebook/facebook_sign_in_test.dart index 2c4b2c9a2..a13a54194 100644 --- a/tests/integration_test/firebase_ui_oauth_facebook/facebook_sign_in_test.dart +++ b/tests/integration_test/firebase_ui_oauth_facebook/facebook_sign_in_test.dart @@ -32,60 +32,45 @@ void main() async { expect(find.text(labels.signInWithFacebookButtonText), findsOneWidget); }); - testWidgets( - 'calls sign in when tapped', - (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - - await tester.pumpAndSettle(); - - // Verify login was invoked by checking that the mock's login method - // completed successfully (actual parameter verification happens in unit tests) - expect(true, isTrue); - }, - ); - - testWidgets( - 'shows loading indicator when sign in is in progress', - (tester) async { - // Create a new provider with a mock that delays - final delayedProvider = FacebookProvider(clientId: 'clientId'); - final delayedMock = MockFacebookAuth(); - delayedProvider.provider = delayedMock; - setMockFacebookProvider(delayedProvider); - - // Override noSuchMethod to add delay - when(delayedMock.login()).thenAnswer( - (realInvocation) async { - await Future.delayed(const Duration(milliseconds: 50)); - return MockLoginResult(); - }, - ); - - await render( - tester, - OAuthProviderButton(provider: delayedProvider), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - ); + testWidgets('calls sign in when tapped', (tester) async { + await render(tester, OAuthProviderButton(provider: provider)); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + + await tester.pumpAndSettle(); + + // Verify login was invoked by checking that the mock's login method + // completed successfully (actual parameter verification happens in unit tests) + expect(true, isTrue); + }); + + testWidgets('shows loading indicator when sign in is in progress', ( + tester, + ) async { + // Create a new provider with a mock that delays + final delayedProvider = FacebookProvider(clientId: 'clientId'); + final delayedMock = MockFacebookAuth(); + delayedProvider.provider = delayedMock; + setMockFacebookProvider(delayedProvider); + + // Override noSuchMethod to add delay + when(delayedMock.login()).thenAnswer((realInvocation) async { + await Future.delayed(const Duration(milliseconds: 50)); + return MockLoginResult(); + }); + + await render(tester, OAuthProviderButton(provider: delayedProvider)); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + await tester.pump(); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); testWidgets('signs the user in', (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); + await render(tester, OAuthProviderButton(provider: provider)); final button = find.byType(OAuthProviderButtonBase); await tester.tap(button); diff --git a/tests/integration_test/firebase_ui_oauth_google/google_sign_in_test.dart b/tests/integration_test/firebase_ui_oauth_google/google_sign_in_test.dart index bffd99260..a68809400 100644 --- a/tests/integration_test/firebase_ui_oauth_google/google_sign_in_test.dart +++ b/tests/integration_test/firebase_ui_oauth_google/google_sign_in_test.dart @@ -36,52 +36,37 @@ void main() async { expect(find.text(labels.signInWithGoogleButtonText), findsOneWidget); }); - testWidgets( - 'calls sign in when tapped', - (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - - await tester.pumpAndSettle(); - verify(provider.provider.signIn()).called(1); - - expect(true, isTrue); - }, - ); - - testWidgets( - 'shows loading indicator when sign in is in progress', - (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); - - when(provider.provider.signIn()).thenAnswer( - (realInvocation) async { - await Future.delayed(const Duration(milliseconds: 50)); - return MockGoogleSignInAccount(); - }, - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - ); + testWidgets('calls sign in when tapped', (tester) async { + await render(tester, OAuthProviderButton(provider: provider)); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + + await tester.pumpAndSettle(); + verify(provider.provider.signIn()).called(1); + + expect(true, isTrue); + }); + + testWidgets('shows loading indicator when sign in is in progress', ( + tester, + ) async { + await render(tester, OAuthProviderButton(provider: provider)); + + when(provider.provider.signIn()).thenAnswer((realInvocation) async { + await Future.delayed(const Duration(milliseconds: 50)); + return MockGoogleSignInAccount(); + }); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + await tester.pump(); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); testWidgets('signs the user in', (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); + await render(tester, OAuthProviderButton(provider: provider)); final button = find.byType(OAuthProviderButtonBase); await tester.tap(button); diff --git a/tests/integration_test/firebase_ui_oauth_twitter/twitter_sign_in_test.dart b/tests/integration_test/firebase_ui_oauth_twitter/twitter_sign_in_test.dart index 4155455c3..da5424dd6 100644 --- a/tests/integration_test/firebase_ui_oauth_twitter/twitter_sign_in_test.dart +++ b/tests/integration_test/firebase_ui_oauth_twitter/twitter_sign_in_test.dart @@ -36,52 +36,37 @@ void main() async { expect(find.text(labels.signInWithTwitterButtonText), findsOneWidget); }); - testWidgets( - 'calls sign in when tapped', - (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - - await tester.pumpAndSettle(); - verify(provider.provider.login()).called(1); - - expect(true, isTrue); - }, - ); - - testWidgets( - 'shows loading indicator when sign in is in progress', - (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); - - when(provider.provider.login()).thenAnswer( - (realInvocation) async { - await Future.delayed(const Duration(milliseconds: 50)); - return MockAuthResult(); - }, - ); - - final button = find.byType(OAuthProviderButtonBase); - await tester.tap(button); - await tester.pump(); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - }, - ); + testWidgets('calls sign in when tapped', (tester) async { + await render(tester, OAuthProviderButton(provider: provider)); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + + await tester.pumpAndSettle(); + verify(provider.provider.login()).called(1); + + expect(true, isTrue); + }); + + testWidgets('shows loading indicator when sign in is in progress', ( + tester, + ) async { + await render(tester, OAuthProviderButton(provider: provider)); + + when(provider.provider.login()).thenAnswer((realInvocation) async { + await Future.delayed(const Duration(milliseconds: 50)); + return MockAuthResult(); + }); + + final button = find.byType(OAuthProviderButtonBase); + await tester.tap(button); + await tester.pump(); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); testWidgets('signs the user in', (tester) async { - await render( - tester, - OAuthProviderButton(provider: provider), - ); + await render(tester, OAuthProviderButton(provider: provider)); final button = find.byType(OAuthProviderButtonBase); await tester.tap(button); @@ -120,10 +105,7 @@ class MockTwitterLogin extends Mock implements TwitterLogin { @override Future login({bool? forceLogin}) async { return super.noSuchMethod( - Invocation.method( - #signIn, - [], - ), + Invocation.method(#signIn, []), returnValue: MockAuthResult(), returnValueForMissingStub: MockAuthResult(), ); diff --git a/tests/integration_test/utils.dart b/tests/integration_test/utils.dart index 18c5e9a5a..6c734bab3 100644 --- a/tests/integration_test/utils.dart +++ b/tests/integration_test/utils.dart @@ -81,10 +81,7 @@ Future render(WidgetTester tester, Widget widget) async { MaterialApp( home: SafeArea( child: Scaffold( - body: Padding( - padding: const EdgeInsets.all(8), - child: widget, - ), + body: Padding(padding: const EdgeInsets.all(8), child: widget), ), ), ), @@ -140,10 +137,7 @@ Future getVerificationCode(String phoneNumber) async { final codes = (body['verificationCodes'] as List).fold>( {}, (acc, value) { - return { - ...acc, - value['phoneNumber']: value['code'], - }; + return {...acc, value['phoneNumber']: value['code']}; }, ); @@ -163,17 +157,13 @@ Future> clearCollection( final snapshot = await ref.get(); if (snapshot.docs.isEmpty) return ref; - await Future.wait([ - for (final doc in snapshot.docs) doc.reference.delete(), - ]); + await Future.wait([for (final doc in snapshot.docs) doc.reference.delete()]); await ref.get(const GetOptions(source: Source.server)); return ref; } -Future clearReference( - DatabaseReference ref, -) async { +Future clearReference(DatabaseReference ref) async { final snapshot = await ref.get(); if (!snapshot.exists) return; await ref.remove(); @@ -220,14 +210,13 @@ TypeMatcher> isQueryBuilderSnapshot({ (value) => value.isFetching, isFetching, ); - matcher = - matcher.applyHaving('hasError', (value) => value.hasError, hasError); - matcher = matcher.applyHaving('hasData', (value) => value.hasData, hasData); matcher = matcher.applyHaving( - 'hasMore', - (value) => value.hasMore, - hasMore, + 'hasError', + (value) => value.hasError, + hasError, ); + matcher = matcher.applyHaving('hasData', (value) => value.hasData, hasData); + matcher = matcher.applyHaving('hasMore', (value) => value.hasMore, hasMore); matcher = matcher.applyHaving( 'isFetchingMore', (value) => value.isFetchingMore, diff --git a/tests/lib/main.dart b/tests/lib/main.dart index a4904de76..b5606d8f2 100644 --- a/tests/lib/main.dart +++ b/tests/lib/main.dart @@ -109,9 +109,7 @@ class _MyHomePageState extends State { // wireframe for each widget. mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - 'You have pushed the button this many times:', - ), + const Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, diff --git a/tests/pubspec.yaml b/tests/pubspec.yaml index 67842bff5..b321ecd60 100644 --- a/tests/pubspec.yaml +++ b/tests/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.5.0 + sdk: ^3.9.0 dependencies: flutter: