firebase_ui_auth 3.0.1
firebase_ui_auth: ^3.0.1 copied to clipboard
Pre-built widgets library that are integrated with the variety of the Firebase Auth providers.
// Copyright 2022, the Chromium project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:firebase_auth/firebase_auth.dart'
hide PhoneAuthProvider, EmailAuthProvider;
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:firebase_ui_localizations/firebase_ui_localizations.dart';
import 'package:firebase_ui_oauth_apple/firebase_ui_oauth_apple.dart';
import 'package:firebase_ui_oauth_facebook/firebase_ui_oauth_facebook.dart';
import 'package:firebase_ui_oauth_google/firebase_ui_oauth_google.dart';
import 'package:firebase_ui_oauth_twitter/firebase_ui_oauth_twitter.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'config.dart';
import 'decorations.dart';
import 'firebase_options.dart';
final actionCodeSettings = ActionCodeSettings(
url: 'https://flutterfire-e2e-tests.firebaseapp.com',
handleCodeInApp: true,
androidMinimumVersion: '1',
androidPackageName: 'io.flutter.plugins.firebase_ui_example',
iOSBundleId: 'io.flutter.plugins.fireabaseUiExample',
);
final emailLinkProviderConfig = EmailLinkAuthProvider(
actionCodeSettings: actionCodeSettings,
);
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
FirebaseUIAuth.configureProviders([
EmailAuthProvider(),
emailLinkProviderConfig,
PhoneAuthProvider(),
GoogleProvider(clientId: GOOGLE_CLIENT_ID),
AppleProvider(),
FacebookProvider(clientId: FACEBOOK_CLIENT_ID),
TwitterProvider(
apiKey: TWITTER_API_KEY,
apiSecretKey: TWITTER_API_SECRET_KEY,
redirectUri: TWITTER_REDIRECT_URI,
),
]);
runApp(const FirebaseAuthUIExample());
}
// Overrides a label for en locale
// To add localization for a custom language follow the guide here:
// https://flutter.dev/docs/development/accessibility-and-localization/internationalization#an-alternative-class-for-the-apps-localized-resources
class LabelOverrides extends DefaultLocalizations {
const LabelOverrides();
@override
String get emailInputLabel => 'Enter your email';
}
class FirebaseAuthUIExample extends StatelessWidget {
const FirebaseAuthUIExample({super.key});
String get initialRoute {
final user = FirebaseAuth.instance.currentUser;
return switch (user) {
null => '/',
User(emailVerified: false, email: final String _) => '/verify-email',
_ => '/profile',
};
}
@override
Widget build(BuildContext context) {
final buttonStyle = ButtonStyle(
padding: WidgetStateProperty.all(const EdgeInsets.all(12)),
shape: WidgetStateProperty.all(
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
);
final mfaAction="/?originalUrl=https%3A%2F%2Fpub.dev%2FAuthStateChangeAction%26lt%3BMFARequired%26gt%3B(%2520%2520%2520%2520%2520%2520(context%2C%2520state)%2520async%2520%257B%2520%2520%2520%2520%2520%2520%2520%2520final%2520nav%2520%3D%2520Navigator.of(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520await%2520startMFAVerification(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520resolver%3A%2520state.resolver%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520nav.pushReplacementNamed(%26%2339%3B%26%2347%3Bprofile%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520return%2520MaterialApp(%2520%2520%2520%2520%2520%2520theme%3A%2520ThemeData(%2520%2520%2520%2520%2520%2520%2520%2520brightness%3A%2520Brightness.light%2C%2520%2520%2520%2520%2520%2520%2520%2520visualDensity%3A%2520VisualDensity.standard%2C%2520%2520%2520%2520%2520%2520%2520%2520useMaterial3%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520inputDecorationTheme%3A%2520const%2520InputDecorationTheme(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520border%3A%2520OutlineInputBorder()%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520elevatedButtonTheme%3A%2520ElevatedButtonThemeData(style%3A%2520buttonStyle)%2C%2520%2520%2520%2520%2520%2520%2520%2520textButtonTheme%3A%2520TextButtonThemeData(style%3A%2520buttonStyle)%2C%2520%2520%2520%2520%2520%2520%2520%2520outlinedButtonTheme%3A%2520OutlinedButtonThemeData(style%3A%2520buttonStyle)%2C%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520initialRoute%3A%2520initialRoute%2C%2520%2520%2520%2520%2520%2520routes%3A%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3B%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520SignInScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520ForgotPasswordAction((context%2C%2520email)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushNamed(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bforgot-password%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520arguments%3A%2520%7B%26%2339%3Bemail%26%2339%3B%3A%2520email%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520VerifyPhoneAction((context%2C%2520_)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushNamed(context%2C%2520%26%2339%3B%26%2347%3Bphone%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthStateChangeAction((context%2C%2520state)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520user%2520%3D%2520switch%2520(state)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520SignedIn(user%3A%2520final%2520user)%2520%3D%26gt%3B%2520user%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520CredentialLinked(user%3A%2520final%2520user)%2520%3D%26gt%3B%2520user%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520UserCreated(credential%3A%2520final%2520cred)%2520%3D%26gt%3B%2520cred.user%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_%2520%3D%26gt%3B%2520null%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520switch%2520(user)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520User(emailVerified%3A%2520true)%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3Bprofile%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520User(emailVerified%3A%2520false%2C%2520email%3A%2520final%2520String%2520_)%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushNamed(context%2C%2520%26%2339%3B%26%2347%3Bverify-email%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520mfaAction%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520EmailLinkSignInAction((context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3Bemail-link-sign-in%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520styles%3A%2520const%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520EmailFormStyle(signInButtonVariant%3A%2520ButtonVariant.filled)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerImage(%26%2339%3Bassets%26%2347%3Bimages%26%2347%3Bflutterfire_logo.png%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideImage(%26%2339%3Bassets%26%2347%3Bimages%26%2347%3Bflutterfire_logo.png%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520subtitleBuilder%3A%2520(context%2C%2520action)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520actionText%2520%3D%2520switch%2520(action)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthAction.signIn%2520%3D%26gt%3B%2520%26%2339%3BPlease%2520sign%2520in%2520to%2520continue.%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthAction.signUp%2520%3D%26gt%3B%2520%26%2339%3BPlease%2520create%2520an%2520account%2520to%2520continue%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_%2520%3D%26gt%3B%2520throw%2520Exception(%26%2339%3BInvalid%2520action%3A%2520%24action%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520Padding(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520padding%3A%2520const%2520EdgeInsets.only(bottom%3A%25208)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BWelcome%2520to%2520Firebase%2520UI!%2520%24actionText.%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520footerBuilder%3A%2520(context%2C%2520action)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520actionText%2520%3D%2520switch%2520(action)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthAction.signIn%2520%3D%26gt%3B%2520%26%2339%3Bsigning%2520in%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthAction.signUp%2520%3D%26gt%3B%2520%26%2339%3Bregistering%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_%2520%3D%26gt%3B%2520throw%2520Exception(%26%2339%3BInvalid%2520action%3A%2520%24action%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520Center(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Padding(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520padding%3A%2520const%2520EdgeInsets.only(top%3A%252016)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3BBy%2520%24actionText%2C%2520you%2520agree%2520to%2520our%2520terms%2520and%2520conditions.%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520style%3A%2520const%2520TextStyle(color%3A%2520Colors.grey)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bverify-email%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520EmailVerificationScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerIcon(Icons.verified)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideIcon(Icons.verified)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actionCodeSettings%3A%2520actionCodeSettings%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520EmailVerifiedAction(()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3Bprofile%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthCancelledAction((context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520FirebaseUIAuth.signOut(context%3A%2520context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3B%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bphone%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520PhoneInputScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520SMSCodeRequestedAction((context%2C%2520action%2C%2520flowKey%2C%2520phone)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(context).pushReplacementNamed(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bsms%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520arguments%3A%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3Baction%26%2339%3B%3A%2520action%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3BflowKey%26%2339%3B%3A%2520flowKey%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3Bphone%26%2339%3B%3A%2520phone%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerIcon(Icons.phone)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideIcon(Icons.phone)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bsms%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520arguments%2520%3D%2520ModalRoute.of(context)%3F.settings.arguments%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520as%2520Map%26lt%3BString%2C%2520dynamic%26gt%3B%3F%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520SMSCodeInputScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthStateChangeAction%26lt%3BSignedIn%26gt%3B((context%2C%2520state)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(context).pushReplacementNamed(%26%2339%3B%26%2347%3Bprofile%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520flowKey%3A%2520arguments%3F%5B%26%2339%3BflowKey%26%2339%3B%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520action%3A%2520arguments%3F%5B%26%2339%3Baction%26%2339%3B%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerIcon(Icons.sms_outlined)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideIcon(Icons.sms_outlined)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bforgot-password%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520arguments%2520%3D%2520ModalRoute.of(context)%3F.settings.arguments%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520as%2520Map%26lt%3BString%2C%2520dynamic%26gt%3B%3F%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520ForgotPasswordScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520email%3A%2520arguments%3F%5B%26%2339%3Bemail%26%2339%3B%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerMaxExtent%3A%2520200%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerIcon(Icons.lock)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideIcon(Icons.lock)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bemail-link-sign-in%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520EmailLinkSignInScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520AuthStateChangeAction%26lt%3BSignedIn%26gt%3B((context%2C%2520state)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3Bprofile%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520provider%3A%2520emailLinkProviderConfig%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerMaxExtent%3A%2520200%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520headerBuilder%3A%2520headerIcon(Icons.link)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520sideBuilder%3A%2520sideIcon(Icons.link)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2347%3Bprofile%26%2339%3B%3A%2520(context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520platform%2520%3D%2520Theme.of(context).platform%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520ProfileScreen(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520SignedOutAction((context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pushReplacementNamed(context%2C%2520%26%2339%3B%26%2347%3B%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520mfaAction%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actionCodeSettings%3A%2520actionCodeSettings%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520showMFATile%3A%2520kIsWeb%2520%7C%7C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520platform%2520%3D%3D%2520TargetPlatform.iOS%2520%7C%7C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520platform%2520%3D%3D%2520TargetPlatform.android%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520showUnlinkConfirmationDialog%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520showDeleteConfirmationDialog%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520title%3A%2520%26%2339%3BFirebase%2520UI%2520demo%26%2339%3B%2C%2520%2520%2520%2520%2520%2520debugShowCheckedModeBanner%3A%2520false%2C%2520%2520%2520%2520%2520%2520supportedLocales%3A%2520const%2520%5BLocale(%26%2339%3Ben%26%2339%3B)%5D%2C%2520%2520%2520%2520%2520%2520localizationsDelegates%3A%2520%5B%2520%2520%2520%2520%2520%2520%2520%2520FirebaseUILocalizations.withDefaultOverrides(const%2520LabelOverrides())%2C%2520%2520%2520%2520%2520%2520%2520%2520GlobalMaterialLocalizations.delegate%2C%2520%2520%2520%2520%2520%2520%2520%2520GlobalWidgetsLocalizations.delegate%2C%2520%2520%2520%2520%2520%2520%2520%2520FirebaseUILocalizations.delegate%2C%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%7D%253C%2Fcode">