为什么它不能使用户保持登录状态

时间:2020-08-27 09:14:11

标签: firebase flutter dart firebase-authentication

用户是否登录均无关紧要,它会转到主页。 如果我每次重新启动应用程序时都将登录页面设为主页,则需要再次登录。

我希望它像登录一次然后登录直到注销为止

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

  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: await getLandingPage(),
    routes: {
      'upload': (context) => ItemInput(),
      'suzuki': (context) => Suzuki(),
      'others': (context) => Others(),
    },
  ));
}

Future<Widget> getLandingPage() async {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  return StreamBuilder<User>(
    stream: _auth.authStateChanges(),
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData && (!snapshot.data.isAnonymous)) {
        return MainPage();
      }

      return LoginPage();
    },
  );
}

3 个答案:

答案 0 :(得分:2)

启动应用程序后,Firebase会自动恢复用户的身份验证状态。这可能需要一些时间,因为它需要与服务器一起检查该帐户是否仍处于活动状态。

在此期间,该用户尚未登录,因此authStateChanges()会触发null。那就是您的代码将用户重定向到登录页面的时候。

您将需要等待片刻,以查看用户状态 是否已恢复,或者将导航逻辑移动/复制到登录页面,以便将其重定向到主页。一旦用户身份验证状态恢复。

答案 1 :(得分:1)

根据文档:

A流异步数据事件的源。 流提供了一种接收事件序列的方式。每个事件要么是数据事件(也称为流的元素),要么是错误事件(错误事件),该事件是发生故障的通知。当流发出所有事件后,一个“完成”事件将通知侦听器已到达末尾。

由于authStateChanges()返回了Stream,因此您可以使用StreamBuilder来获取结果并相应地显示小部件。

根据StreamBuilder文档:

例如,当与产生整数0到9的流进行交互时,可以使用以下快照的任何有序子序列(包括最后一个快照(带有ConnectionState.done的快照))调用生成器:

  • 新的AsyncSnapshot.withData(ConnectionState.waiting,null)
  • 新的AsyncSnapshot.withData(ConnectionState.active,0)
  • 新的AsyncSnapshot.withData(ConnectionState.active,1) ...
  • 新的AsyncSnapshot.withData(ConnectionState.active,9)
  • 新的AsyncSnapshot.withData(ConnectionState.done,9)

因此,用于异步操作的类型AsyncWidgetBuilderbuilder将根据Stream的状态调用您的小部件,例如:

  @override
  Widget build(BuildContext context) {
  final FirebaseAuth _auth = FirebaseAuth.instance;
    return new Scaffold(
        body: StreamBuilder(
            stream: _auth.authStateChanges(),
            builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
              if (snapshot.connectionState == ConnectionState.active) {
                if (snapshot.hasData)
                  return MainPage();
                else
                  return LoginPage();
              } else
                return Center(
                  child: CircularProgressIndicator(),
                );
            }));
  }

您可以在启动屏幕中使用以上代码,在此Stream处于等待状态,它将首先显示加载,然后在检索数据时(如果为null或有一个用户登录,它将进入active状态并返回一个满足条件的小部件。

https://api.flutter.dev/flutter/widgets/AsyncWidgetBuilder.html

https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html

https://api.flutter.dev/flutter/widgets/StreamBuilder/builder.html


与OP交谈后。他们正在使用以下插件google_sign_in,并拥有一个带有以下代码的auth.dart文件:

void signOutGoogle() async {
await googleSignIn.signOut();
}

在这种情况下,发生的情况是该用户从Google auth退出,但仍在Firebase中登录,因此,您可以添加以下内容:

void signOutGoogle() async {
await googleSignIn.signOut();
await _auth.signOut();
}

答案 2 :(得分:1)

根据弗兰克的回答,这是解决如何使用import {Elements} from '@stripe/react-stripe-js'; import {loadStripe} from '@stripe/stripe-js'; const stripePromise = loadStripe('pk_test_123'); const App = () => { return ( <Elements stripe={stripePromise}> <PaymentComponentWithCardElementEtc /> </Elements> ); }; 小部件在第一个1 1 1 1 1 1 1 1 1 1 1 事件上收到$ sed 's/foo/oog/g;' ffoo foog 的问题。

oogg

}

如果您不想使用switch语句,则只能检查null

authStateChanges()
相关问题