Persist user Auth Flutter Firebase

I believe your problem is routing. In my apps I use FirebaseAuth and it works just as you say you wanted to, and I don't persist any login token. However, I don't know why your approach of using a getUser is not working.

Try to adjust your code to use onAuthStateChanged. EDIT: As of 2022, with Flutter 3, I noticed it worked better with userChanges instead.

Basically, on your MaterialApp, create a StreamBuilder listening to _auth.userChanges() and choose your page depending on the Auth status.

I'll copy and paste parts of my app so you can have an idea:

[...]

final FirebaseAuth _auth = FirebaseAuth.instance;

Future<void> main() async {
  FirebaseApp.configure(
    name: '...',
    options:
      Platform.isIOS
        ? const FirebaseOptions(...)
        : const FirebaseOptions(...),
    );
  
  [...]  

  runApp(new MaterialApp(
    title: '...',
    home: await getLandingPage(),
    theme: ThemeData(...),
  ));
}

Future<Widget> getLandingPage() async {
  return StreamBuilder<FirebaseUser>(
    stream: _auth.userChanges(),
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData && (!snapshot.data!.isAnonymous)) {
        return HomePage();
      }
      
      return AccountLoginPage();
    },
  );
}

You can use shared_preferences to keep alive your session even when you kill the app. Here is the documentation https://pub.dartlang.org/packages/shared_preferences.

Also I've heard that it's possible to use sqlite to persist the session.


void main() {
FirebaseAuth.instance.authStateChanges().listen((User user) {
  if (user == null) {
          runApp(MyApp(auth : false);
        } else {
          runApp(MyApp(auth : false);
       }
    });
}

class MyApp extends StatefulWidget {
  final bool auth;
  MyApp({this.auth});
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  return MaterialApp(
  ......
  ......
  home: widget.auth ? MainScreen() : AuthScreen();
);

Sorry, it was my mistake. Forgot to put the push login screen in else.

  Future<void> _handleStartScreen() async {
    Auth _auth = Auth();
    if (await _auth.isLoggedIn()) {
      Navigator.of(context).pushReplacementNamed("/chat");
    }
    else {
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
    }
  }