我正在编写一个集成了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
不是主页,而且,用户可以点击后退按钮并返回欢迎屏幕。
我失去了什么?我完全错了,有一种完全不同的方式做我想做的事情,或者基础是否正确?如果是这样,我该如何实现我想要的呢?
提前致谢。
答案 0 :(得分:1)
您正在寻找Navigator.pushReplacement
或Navigator.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()));
}
}