flutterdartfirebase-authenticationflutter-riverpod

Flutter Firebase UI not updating and showing correct user info after signing out and in with different user


I'm creating and testing a simple dashboard that I want to display the current user's email. I'm just using test1@test.com and test2@test.com. When I signout of test1 and sign in with test2, my UI still says "Good Evening, test1@test.com" when it should be test2@test.com.

I'm using Firebase Authentication and here is the basic code for displaying the user email(cutting out lots of columns and stuff):

final userEmail = FirebaseAuth.instance.currentUser!.email;

class Dashboard extends ConsumerStatefulWidget {
  const Dashboard({Key? key}) : super(key: key);

  @override
  _DashboardState createState() => _DashboardState();
}

class _DashboardState extends ConsumerState<Dashboard> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(children: [
         Padding(
            padding: const EdgeInsets.fromLTRB(0, 15, 0, 15),
               child: AutoSizeText(
                  'Good Morning, $userEmail!',
                              ),
                            ),

Then, for signing out I just call a simple Firebase instance.

 ElevatedButton(
                  
                  onPressed: FirebaseAuth.instance.signOut,
                  child: const Text(
                    'Sign Out',
                  ))

The signing out in and works fine with my authentication repo but not sure why the UI isn't updating to current user. I thought this would be enough. I tried adding

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

but that also didn't work.


Solution

  • You are setting the variable right in the starting and it won't update itself after signing out and signing in. You must update it every time a change occurs.

    To do so you can add this in initState:

    @override
    void initState() {
        super.initState();
        FirebaseAuth.instance.authStateChanges().listen((User? user) {
            userEmail = user!.email;
        });
    }
    

    And you should also declare the userEmail variable with var instead of final.