如何在首次访问时处理Firebase登录

时间:2018-05-29 11:14:18

标签: firebase navigation dart firebase-authentication flutter

我正在编写一个集成了Firebase身份验证的Flutter应用程序。

问题

如果用户在应用程序启动时进行身份验证,我希望以最佳和最佳方式集成身份验证检查。如果用户已通过身份验证,则应用程序将打开正常的主页,否则将显示身份验证页面。身份验证后,应用程序应将用户重定向到正常的主页。由于显而易见的原因,用户无法点击后退按钮并返回认证页面。

到目前为止我做了什么

当应用程序检查main()用户是否经过身份验证时,如果是,则会创建MaterialApp,其中home的主页为'/'。应用程序。在这种情况下,应用程序的MaterialApp是主页。如果不是,则应用会创建home,其身份为'/',即身份验证屏幕。但是,在这种情况下,Navigator.of(context).popUntil(ModalRoute.withName('/')) 是欢迎屏幕,所以我无法使用

'/'

(事实上,这恰好是非常必要和有用的),因为select studentnr, name, gradenumber, languages[1] as language_1, languages[2] as language_2, languages[3] as language_3, languages[4] as language_4, languages[5] as language_5 FROM ( SELECT s.studentnumber as studentnr, p.firstname AS name, sl.gradenumber as gradenumber, array_agg(DISTINCT l.text) as languages FROM student s JOIN pupil p ON p.id = s.pupilid JOIN pupillanguage pl on pl.pupilid = p.id JOIN language l on l.id = pl.languageid JOIN schoollevel sl ON sl.id = p.schoollevelid GROUP BY s.studentnumber, p.firstname ) t 不是主页,而且,用户可以点击后退按钮并返回欢迎屏幕。

问题

我失去了什么?我完全错了,有一种完全不同的方式做我想做的事情,或者基础是否正确?如果是这样,我该如何实现我想要的呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您正在寻找Navigator.pushReplacementNavigator.pushReplacementNamed

https://docs.flutter.io/flutter/widgets/Navigator-class.html https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html https://docs.flutter.io/flutter/widgets/Navigator/pushReplacementNamed.html

这是一个快速示例代码。

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("First screen"),
        RaisedButton(
          child: Text("Go to second screen"),
          onPressed: () => _goToSecondScreen(context),
        ),
      ],
    );
  }

  _goToSecondScreen(context) {
    Navigator.of(context).pushReplacement(
        MaterialPageRoute(builder: (context) => SecondScreen()));
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("Second screen"),
        RaisedButton(
          child: Text("Go to first screen"),
          onPressed: () => _goToFirstScreen(context),
        ),
      ],
    );
  }

  _goToFirstScreen(context) {
    Navigator.of(context).pushReplacement(
        MaterialPageRoute(builder: (context) => FirstScreen()));
  }
}