flutter - 如何让用户始终登录
问题描述
即使用户关闭应用程序,我也想让用户保持登录状态。问题是如果我关闭应用程序,我会出现在 WelcomePage() 而不是 HomePage() 中。
在 main.dart 中,initialRoute 是 WelcomePage(),但我需要在用户注册或登录后更改它。我需要更改什么?
这是我所拥有的:
import 'package:flutter/material.dart';
import 'pages/account/WelcomePage.dart';
import 'pages/match/HomePage.dart';
void main() => runApp(MyApp());
// Test
class MyApp extends StatelessWidget {
//
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
//
initialRoute: WelcomePage.id,
//
routes: {
WelcomePage.id: (context) => WelcomePage(),
HomePage.id: (context) => HomePage(),
},
);
}
}
编辑:我正在阅读用户必须仍然登录,所以我必须在这里做的是检查用户是否不为空,然后将HomePage.id
. 但是要检查用户是否登录,我需要一个async
函数,并且initialRoute
不接受Future
s。
解决方案
与其总是直接转到 ,不如WelcomePage
制作一个显示加载指示器的小部件,直到您确定登录状态。确定此状态后,您可以显示WelcomePage
或HomePage
基于此状态。
此类小部件的一个示例是RootPage
来自this medium article。文章示例:
enum AuthStatus {
NOT_DETERMINED,
NOT_LOGGED_IN,
LOGGED_IN,
}
class RootPage extends StatefulWidget {
RootPage({this.auth});
final BaseAuth auth;
@override
State<StatefulWidget> createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
String _userId = "";
@override
void initState() {
super.initState();
widget.auth.getCurrentUser().then((user) {
setState(() {
if (user != null) {
_userId = user?.uid;
}
authStatus =
user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
});
});
}
void loginCallback() {
widget.auth.getCurrentUser().then((user) {
setState(() {
_userId = user.uid.toString();
});
});
setState(() {
authStatus = AuthStatus.LOGGED_IN;
});
}
void logoutCallback() {
setState(() {
authStatus = AuthStatus.NOT_LOGGED_IN;
_userId = "";
});
}
Widget buildWaitingScreen() {
return Scaffold(
body: Container(
alignment: Alignment.center,
child: CircularProgressIndicator(),
),
);
}
@override
Widget build(BuildContext context) {
switch (authStatus) {
case AuthStatus.NOT_DETERMINED:
return buildWaitingScreen();
break;
case AuthStatus.NOT_LOGGED_IN:
return new LoginSignupPage(
auth: widget.auth,
loginCallback: loginCallback,
);
break;
case AuthStatus.LOGGED_IN:
if (_userId.length > 0 && _userId != null) {
return new HomePage(
userId: _userId,
auth: widget.auth,
logoutCallback: logoutCallback,
);
} else
return buildWaitingScreen();
break;
default:
return buildWaitingScreen();
}
}
}
推荐阅读
- c++ - MSVC2019 静态库中缺少符号名称
- android - 如何使用 ejabberd 聊天应用程序通过 API 层传递服务器
- sql - SQL Server CTE 层次结构查询聚合
- python - Python 模块无法从包中导入
- flutter - 在 Flutter 中将 onPressed 或 onTab 添加到 BubbleBottomBarItem
- css - 为什么附近的 DIV 不会与此 DIV 浮动在同一条线上?
- gitlab - 是否可以让多个 gitlab-runners 都执行相同的作业?
- angular - 解析 http 期间的 Http 失败
- javascript - 当我使用脚本标签时,html() 在 Firefox 中不起作用
- python - pandas.core.base.DataError:没有要聚合的数字类型