【问题标题】:FirebaseAuth.instance.onAuthStateChanged is not triggering the stream builder when user logs out用户注销时 FirebaseAuth.instance.onAuthStateChanged 不会触发流生成器
【发布时间】:2020-10-23 10:51:04
【问题描述】:

我的 Flutter 应用包含几个屏幕,例如设置、添加产品、详细信息页面。

如果用户在设置页面并单击注销,即“FirebaseAuth.instance.signOut( );" ,应用程序停留在相同的设置页面上,并且不会重定向到我们在主页中使用的流构建器中提到的登录页面,如下所示。

MaterialApp(
          home: StreamBuilder(
            stream: FirebaseAuth.instance.onAuthStateChanged,
            builder: (ctx, snapSot) {
              if (snapSot.hasData) {
                return HomePage();
              } else
                return  LoginScreen();
            },
          ),),)

包版本:

  • 提供者:^4.1.2
  • firebase_auth:^0.16.1

我的期望:

用户在哪个页面,如果他退出,他必须被带到登录屏幕。正如我正在使用 Streambuilder 和我已将流源提供为 onAuthStateChanged。

工作场景:

但是当用户在主页屏幕中单击注销时,它会按预期工作并且用户被带到登录页面。

不工作场景:

如果用户在任何其他页面中,它不会重定向到登录页面。单击退出时,我可以在控制台中看到以下日志。

场景:用户导航:登录->主页->应用抽屉->设置页面->注销

I/flutter ( 6186): HomePage
I/flutter ( 6186): appDrawer
I/flutter ( 6186): Settings
I/flutter ( 6186): appDrawer
I/flutter ( 6186): logoutDialog
D/FirebaseAuth( 6186): Notifying id token listeners about a sign-out event.
D/FirebaseAuth( 6186): Notifying auth state listeners about a sign-out event.

尝试使用 Stream 解决方法:

主应用文件:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<UserAccount>.value(
      value: Authservice().user,
      child: MaterialApp(
        home: Wrapper(),
        onGenerateRoute: CustomRouter.generateRoute,
        initialRoute: homeRoute,
      ),
    );
  }
}

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<UserAccount>(context);
    print("user: $user");
    if (user == null)
      return LoginScreen();
    else
      return Dashboard();
  }
}

验证服务文件:

Stream<UserAccount> get user {
    return _auth.onAuthStateChanged.map(_userFBAccount);
  }

UserAccount _userFBAccount(FirebaseUser user) {
    return user != null
        ? UserAccount(
            uid: user.uid,
           )
        : null;
  }

Future<void> logout() async {
    try {
      print("logout");
      await _auth.signOut();
    } catch (error) {
      print("logout $error");
    }
  }

警报对话按钮代码

FlatButton(
                onPressed: () async {
                  Navigator.of(ctx).pop(); // to pop put the alert Dialogue
                  await _authservice.logout().then((value) {
                    if (Navigator.canPop(ctx)) Navigator.of(ctx).pop();
                  });
                },
                child: const Text("Yes"),
                shape: Border(
                  right: BorderSide(color: Colors.grey),
                ),
              ),

我在这里遗漏了一些逻辑还是 Firebase_auth 插件 onAuthStateChanged 的​​问题?

谢谢

【问题讨论】:

  • 我不久前解决了一个类似的问题。见here
  • @Nolence 谢谢你会试试看。
  • @Nolence ,能够通过您在给定链接中提到的方法解决我的问题,非常感谢。有没有一种方法可以通过使用 Main-app 的服务使用全局导航键来解决这个问题,直到它的所有路线导航?这样当用户退出时,它会从应用程序内的任何页面转到 Auth 页面
  • 我不确定,因为我没有尝试过,但如果您找到其他解决方案,请随时告诉我。必须添加 willPopScope 小部件一直困扰着我,我不怀疑有一个更清洁的解决方案。
  • 这些问题解决了吗?

标签: flutter firebase-authentication


【解决方案1】:

用户退出时停留在“设置”屏幕的原因可能是因为您的“设置”屏幕位于导航器中,它是小部件树的MaterialApp 的子级。

由于侦听AuthStateChange 的流也是MaterialApp 的子流,因此流和设置页面位于不同的小部件树中。

我建议您将StreamBuilder 移到MaterialApp 上方。 设置页面也将能够监听 AuthStateChanges。

StreamBuilder(
        stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (ctx, snapSot) {
          return MaterialApp(
             home: snapSot.hasData ? HomePage() : LoginScreen(),
          );
)

这应该可以解决问题

作为替代方案,您也可以await 退出事件,然后在用户退出后自动弹出页面。

例如

await _authObject.signOut.then((value) {
  if(Navigator.canPop)
    Navigator.of(context).pop;
});

【讨论】:

  • 按照您提供的代码 sn-p 尝试使用 StreamBuilder 包装 MaterialApp,仍然是相同的行为。当我尝试从设置页面注销时,它仍然停留在设置页面中。我也在等待_authObject.signOut。
  • OK 退出后,从设置页面按回,是不是跳转到登录页面??
  • 用我正在使用的更多代码示例更新了我的帖子。不,它会关闭我的应用程序并转到 android 主屏幕。我注意到在日志中再次设置页面构建方法在我按下退出后被调用。
  • 好的,在signOut之后删除异步任务。(弹出上下文的那个)然后看看它在你注销后做了什么。并从设置屏幕按返回
  • 删除了 pop 代码并尝试了 .仍然是相同的行为,它关闭我的应用程序并转到 android 主屏幕。
猜你喜欢
  • 2012-08-09
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2011-12-08
  • 2021-05-30
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多