flutterfirebaseshowdialog

Dialog box is not appearing showDialog in flutter with firebase as backend


I am trying for the dialog box to appear with the error message when the user input his email. It is not working, it is not appearing in the app as well as not printing on the console. Here is the code and the console when i,m running the app.I m using firebase as backend and trying to create forgot password page to send a reset password link when user click on button


import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:ur_mentor/auth_file/main_page.dart';
import 'package:ur_mentor/pages_file/LoginPage.dart';
//import 'package:ur_mentor/pages_file/LoginPage.dart';

class ForgotPassword extends StatefulWidget {
  const ForgotPassword({Key? key}) : super(key: key);

  @override
  State<ForgotPassword> createState() => _ForgotPasswordState();
}

class _ForgotPasswordState extends State<ForgotPassword> {
  final _emailController = TextEditingController();

  @override
  void dispose() {
    _emailController.dispose();
    super.dispose();
  }

  Future passwordReset() async {
    try {
      FirebaseAuth.instance
          .sendPasswordResetEmail(email: _emailController.text.trim());
    } on FirebaseAuthException catch (e) {
      debugPrint(e.toString());
      showDialog(
          context: context,
          builder: (BuildContext context) => AlertDialog(
                content: Text(e.toString()),
              ));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[300],
      body: Column(
        children: [
          //Back IconButton
          Padding(
            padding: const EdgeInsets.fromLTRB(300, 30, 0, 0),
            child: IconButton(
              onPressed: ()=> Navigator.pop(context,false),
              icon: const Icon(Icons.exit_to_app_outlined),
              iconSize: 33.0,
              splashColor: Colors.blue,
              splashRadius: 30,
            ),
          ),

          //Enter email text
          Padding(
            padding: EdgeInsets.fromLTRB(10, 80, 10, 0),
            child: Text(
              'Enter the email to receive reset password link',
              style: TextStyle(
                fontSize: 20,
                fontWeight: FontWeight.bold,
                fontFamily: 'AppleFont',
              ),
              textAlign: TextAlign.center,
            ),
          ),

          //email Textfield
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 25),
            child: Container(
              //decoration: BoxDecoration(
              //color: Colors.grey[200],
              // border: Border.all(color: Colors.white),
              //borderRadius: BorderRadius.circular(20),
              //),
              child: TextField(
                controller: _emailController,
                decoration: InputDecoration(
                  filled: true,
                  fillColor: Colors.grey[200],
                  hintText: 'name@example.com',
                  labelText: 'Email',
                  prefixIcon: Icon(Icons.mail),
                  suffixIcon: _emailController.text.isEmpty
                      ? Container(
                          width: 0,
                        )
                      : IconButton(
                          icon: Icon(Icons.close),
                          onPressed: () => _emailController.clear(),
                        ),
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(12.0)),
                ),
                keyboardType: TextInputType.emailAddress,
                textInputAction: TextInputAction.done,
              ),
            ),
          ),

          //Reset Button
          ElevatedButton(
            onPressed: passwordReset,
            child: Text(
              'Reset Password',
              style: TextStyle(
                  fontSize: 16,
                  fontFamily: 'AppleFont',
                  fontWeight: FontWeight.w600),
            ),
            style: ElevatedButton.styleFrom(
                backgroundColor: Colors.blue,
                padding: EdgeInsets.fromLTRB(20, 8, 20, 8)),
          ),
        ],
      ),
    );
  }
}

//here is the console display

W/System  (25885): Ignoring header X-Firebase-Locale because its value was null.
E/flutter (25885): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: [firebase_auth/invalid-email] The email address is badly formatted.
E/flutter (25885): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:653:7)
E/flutter (25885): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:296:18)
E/flutter (25885): <asynchronous suspension>
E/flutter (25885): #2      MethodChannelFirebaseAuth.sendPasswordResetEmail (package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart:343:7)
E/flutter (25885): <asynchronous suspension>
E/flutter (25885): 
E/Parcel  (25885): Reading a NULL string not supported here.

Solution

  • You need to pass your BuildContext to the resetPassword function:

     Future passwordReset(BuildContext context) async {
        try {
          FirebaseAuth.instance
              .sendPasswordResetEmail(email: _emailController.text.trim());
        } on FirebaseAuthException catch (e) {
          debugPrint(e.toString());
          showDialog(
              context: context,
              builder: (BuildContext context) => AlertDialog(
                    content: Text(e.toString()),
                  ));
        }
      }
    

    Then change the onPressed method of your ElevatedButton to this:

     ElevatedButton(
                onPressed: () => passwordReset(context), // ADD THIS
                child: Text(
                  'Reset Password',
                  style: TextStyle(
                      fontSize: 16,
                      fontFamily: 'AppleFont',
                      fontWeight: FontWeight.w600),
                ),
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                    padding: EdgeInsets.fromLTRB(20, 8, 20, 8)),
              ),