firebase_ui_auth 3.0.1 copy "firebase_ui_auth: ^3.0.1" to clipboard
firebase_ui_auth: ^3.0.1 copied to clipboard

Pre-built widgets library that are integrated with the variety of the Firebase Auth providers.

example/lib/main.dart

// 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">