如何保持用户始终登录

时间:2020-05-26 21:19:10

标签: flutter dart

即使用户关闭应用程序,我也希望保持用户登录状态。问题是,如果我关闭应用程序,则会显示在WelcomePage()而不是HomePage()中。

在main.dart中,initialRoute是WelcomePage(),但是一旦用户注册或登录,我就需要对其进行更改。我需要更改什么?

这就是我所拥有的:

import 'package:flutter/material.dart';
import 'pages/account/WelcomePage.dart';
import 'pages/match/HomePage.dart';

void main() => runApp(MyApp());

// Test
class MyApp extends StatelessWidget {
  //
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      //
      initialRoute: WelcomePage.id,
      //
      routes: {
        WelcomePage.id: (context) => WelcomePage(),
        HomePage.id: (context) => HomePage(),
      },
    );
  }
}

编辑:我读到该用户必须仍然登录,所以我在这里要做的是检查用户是否不为null,然后脓到HomePage.id 。但是要检查用户是否已登录,我需要一个async函数,并且initialRoute不接受Future

1 个答案:

答案 0 :(得分:1)

而不是总是直接转到WelcomePage,而是创建一个显示加载指示器的小部件,直到您确定登录状态。确定此状态后,您可以根据此状态显示WelcomePageHomePage

此类小部件的一个示例是此medium article中的RootPage。 文章示例:

enum AuthStatus {
  NOT_DETERMINED,
  NOT_LOGGED_IN,
  LOGGED_IN,
}

class RootPage extends StatefulWidget {
  RootPage({this.auth});

  final BaseAuth auth;

  @override
  State<StatefulWidget> createState() => new _RootPageState();
}

class _RootPageState extends State<RootPage> {
  AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
  String _userId = "";

  @override
  void initState() {
    super.initState();
    widget.auth.getCurrentUser().then((user) {
      setState(() {
        if (user != null) {
          _userId = user?.uid;
        }
        authStatus =
            user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
      });
    });
  }

  void loginCallback() {
    widget.auth.getCurrentUser().then((user) {
      setState(() {
        _userId = user.uid.toString();
      });
    });
    setState(() {
      authStatus = AuthStatus.LOGGED_IN;
    });
  }

  void logoutCallback() {
    setState(() {
      authStatus = AuthStatus.NOT_LOGGED_IN;
      _userId = "";
    });
  }

  Widget buildWaitingScreen() {
    return Scaffold(
      body: Container(
        alignment: Alignment.center,
        child: CircularProgressIndicator(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    switch (authStatus) {
      case AuthStatus.NOT_DETERMINED:
        return buildWaitingScreen();
        break;
      case AuthStatus.NOT_LOGGED_IN:
        return new LoginSignupPage(
          auth: widget.auth,
          loginCallback: loginCallback,
        );
        break;
      case AuthStatus.LOGGED_IN:
        if (_userId.length > 0 && _userId != null) {
          return new HomePage(
            userId: _userId,
            auth: widget.auth,
            logoutCallback: logoutCallback,
          );
        } else
          return buildWaitingScreen();
        break;
      default:
        return buildWaitingScreen();
    }
  }
}
相关问题