The issue is that my app does not navigate to another page automatically when user logs in or out.

class MyApp extends StatelessWidget {

  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      // Initialize FlutterFire:
      future: _initialization,
      builder: (context, snapshot) {

        if (snapshot.connectionState == ConnectionState.done) {
          return StreamProvider<User>.value(
            value: AuthService().user,
            child: MaterialApp(home: Wrapper()),
          );
        }

        return Center(child: CircularProgressIndicator());
      },
    );
  }
}
class Wrapper extends StatelessWidget {
  const Wrapper({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    if (user != null) {

      return MaterialApp(initialRoute: '/', routes: {
        '/': (context) => Home(),
        '/profile': (context) => Profile()
      });
    }

    return MaterialApp(initialRoute: '/', routes: {
      '/': (context) => Welcome(),
      '/signup': (context) => SignUp(),
      '/signin': (context) => SignIn()
    });
  }
}

When the app starts it does show the Welcome() page. Then i am able to navigate to the signup page by pressing a signup button as such

onPressed: () {Navigator.pushNamed(context, "/signup");}),

but then when the user signs up, the app doesn't automatically navigate to Home()

class AuthService {
  FirebaseAuth auth = FirebaseAuth.instance;

  User _userFromFirebaseUser(User user) {
    return user != null ? User(id: user.uid) : null;
  }

  Stream<User> get user {
    return auth.authStateChanges().map(_userFromFirebaseUser);
  }

  Future<String> signUp(email, password) async {
    try {
      UserCredential user = await auth.createUserWithEmailAndPassword(
          email: email, password: password);

      await FirebaseFirestore.instance
          .collection('users')
          .doc(user.user.uid)
          .set({'name': email, 'email': email});
      _userFromFirebaseUser(user.user);
    } on FirebaseAuthException catch (e) {
      return e.code;
    } catch (e) {
      return e;
    }

    return "";
  }
}

I am not sure what the issue is. Any help is appreciated.


Solution 1: Tornike Kurdadze

First of all you need 1 MaterialApp not 3, then try to debug signUp method maybe there is an erorr for instance signUp returns Future<String> but in catch block you are returning an Exception and finally I suggest you to use Cubit whenever you need to listen state changes to navigate.