Flutter Firebase App goes to Waiting Connection State when hot-reloaded

Viewed 23

I have a Flutter application running through VS Code which does simple authentication using Firebase. Following is my full program.

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'package:fireauth_starter/views/home_view.dart';
import 'views/login_page_view.dart';


void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(FireAuthStarter());
}

class FireAuthStarter extends StatelessWidget {
  //final Future<FirebaseApp> _initialisation = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {
    //

    return Provider<FirebaseAuth>(
      create: (context) => FirebaseAuth.instance,
      child: MaterialApp(
        title: 'Firebase Authentication',
        home: LandingPage(),
      ),
    );
  }
}

class LandingPage extends StatelessWidget {
  const LandingPage();

  @override
  Widget build(BuildContext context) {
    final firebaseAuth = Provider.of<FirebaseAuth>(context);
    return StreamBuilder<User>(
        stream: firebaseAuth.authStateChanges(),
        builder: (context, AsyncSnapshot<User> snapshot) {
          print(snapshot.connectionState.toString());
          if (snapshot.connectionState == ConnectionState.active) {
            //final bool signedIn = snapshot.hasData;
            User user = snapshot.data;
            return user == null ? LoginPageView() : HomeView();
            //return signedIn ? DashBoard() : FirstView();
          } else {
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(),
              ),
            );
          }
        });
  }
}


class LoginPageView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final firebaseAuth = Provider.of<FirebaseAuth>(context);

    return MaterialApp(
      home: Center(
        child: Container(
          child: TextButton(
            child: Text('Sign In'),
            onPressed: () {
              firebaseAuth.signInWithEmailAndPassword(
                email: 'myemail@email.com',
                password: '1234567',
              );
            },
          ),
        ),
      ),
    );
  }
}



class HomeView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final firebaseAuth = Provider.of<FirebaseAuth>(context);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Home View'),
          actions: [
            TextButton(
              child: Text('Sign Out'),
              style: ButtonStyle(
                foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
              ),
              onPressed: () {
                firebaseAuth.signOut();
              },
            ),
          ],
        ),
        body: Center(
          child: Container(child: Text('Home View content')),
        ),
      ),
    );
  }
}

The application works as expected but when I use hot reload or hot restart, app get stuck in Progress Indicator because the snapshot.connectionState returns 'ConnectionState.waiting'

https://api.flutter.dev/flutter/widgets/ConnectionState-class.html states waiting: indicating that the asynchronous operation has begun, typically with the data being null.

I though the hot restart will reset all the states and app will perform as initial load. But it doesn't. What am I missing in this?

0 Answers
Related