在iOS上使用Flutter进行Firebase注销/注销

时间:2020-05-13 18:56:55

标签: flutter firebase-authentication

我对在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是开始屏幕,用户可以在其中选择登录还是唱歌。

被推送到欢迎屏幕后,出现以下错误:

接收者:null 尝试调用:uid flutter:NoSuchMethodError:在空调用getter'uid'。

所以我的问题是:

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

2 个答案:

答案 0 :(得分:1)

因此,在尝试解决此问题一段时间后,我发现了问题:

我在登录页面的后台有一些功能,该功能加载了用户信息,因此,一旦用户完成登录,一切就准备就绪。

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

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

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

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

答案 1 :(得分:0)

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

要关闭所有活动屏幕,您可以使用以下代码代替导航到欢迎屏幕,“ /”表示根页面,因此您可以在此处写页面名称:

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