【问题标题】:Firebase Logout / Signout with Flutter on iOS在 iOS 上使用 Flutter 进行 Firebase 注销/注销
【发布时间】:2020-08-30 02:54:56
【问题描述】:

我有一些关于在 Flutter 应用程序 (iOS) 上使用 Firebase 身份验证(电子邮件和密码)时说出用户的问题。我搜索了很多,但我无法理解我的问题的最后一点。

所以在我的应用程序中,我有多个屏幕,我使用 Navigator.pushNamed(...) 进行路由。 用户能够导航到他应该能够注销的设置屏幕。

class _OptionScreenState extends State<OptionScreen> {
  FirebaseAuth _auth = FirebaseAuth.instance;

  _signOut() async {
    try {
      await _auth.signOut();
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
           (...some more code here....)
            ListTile(
              title: Text(
                'Logout',
                style: TextStyle(fontSize: 25.0),
              ),
              onTap: () async {
                await _signOut();
               Navigator.pushReplacementNamed(context, 'welcome_screen');
              },

Welcome_Screen 是用户可以在其中选择登录或唱歌的起始屏幕。

被推送到欢迎屏幕后,我收到以下错误:

接收者:空 尝试调用:uid 颤振:NoSuchMethodError:在 null 上调用了 getter 'uid'。

所以我的问题是:

  1. 我在任何需要的地方创建身份验证实例。我需要一个全局实例还是必须唱出我创建的每个实例?我感觉其他“屏幕”仍然处于活动状态,并且在登录后他们错过了一个活动用户(我希望这是可以理解的) 如果为真:我可以关闭这些屏幕吗?以便用户在注销后使用“新鲜”应用程序开始?
  2. 有解决办法吗(哈哈)
  3. 我应该使用 Provider 来共享一个 _auth 实例吗?

【问题讨论】:

    标签: flutter firebase-authentication


    【解决方案1】:

    所以在尝试解决这个问题一段时间后,我发现了问题:

    我在登录页面的后台有一些功能,它加载了用户信息,所以一旦用户完成登录,一切就准备好了。

    问题是在构建登录页面时调用了某些函数,并且在注销后没有用户可以从中加载信息。

    我在用户成功登录后放置了这些功能,现在一切正常,用户可以退出而不会出现任何错误。现在我可以确保在调用这些函数时有一个登录用户。

    我无法解释的是为什么在welcome_screen上显示错误,因为此屏幕内没有任何功能,顺序是: 欢迎屏幕 -> 登录屏幕。 因此,当我将所有内容关闭到欢迎屏幕时,通常不会加载登录屏幕。但是错误仍然消失了。

    感谢@Lunedor 向我展示了如何关闭之前的所有屏幕。

    【讨论】:

    • 如果用户在欢迎页面登录时有导航命令或您检查的任何情况是否已登录,则背景屏幕或数据将假定仍记录并尝试导航到下一页或处理登录信息,因此这可能是第一个错误的原因。
    【解决方案2】:

    我认为您的问题与您的欢迎屏幕有关,也许看看它的代码会更好。但只需快速响应,您就可以在此欢迎屏幕中检查 uid 是否为空,如果它为空,您可以在不登录时引导您的流程。

    对于关闭所有活动屏幕,您可以使用下面的代码而不是导航到欢迎屏幕,“/”表示根页面,因此您可以在那里写下您的页面名称:

    SchedulerBinding.instance.addPostFrameCallback((_) {
        Navigator.of(context).pushNamedAndRemoveUntil(
            '/', (Route<dynamic> route) => false);
      });
    

    【讨论】:

    • 感谢您的回复。为了查看欢迎屏幕是否导致问题,我调用了 signout() 函数而不导航到另一个屏幕。可悲的是,错误仍然相同。所以错误似乎与欢迎屏幕无关。我实现了关闭所有屏幕的代码,我认为它工作正常,谢谢:)
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2017-06-19
    • 2021-07-30
    相关资源
    最近更新 更多