即使用户关闭应用程序,我也希望保持用户登录状态。问题是,如果我关闭应用程序,则会显示在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(),
},
);
}
}
编辑:我读到该用户必须仍然登录,所以我在这里要做的是检查用户是否不为null,然后脓到HomePage.id
。但是要检查用户是否已登录,我需要一个async
函数,并且initialRoute
不接受Future
。
答案 0 :(得分:1)
而不是总是直接转到WelcomePage
,而是创建一个显示加载指示器的小部件,直到您确定登录状态。确定此状态后,您可以根据此状态显示WelcomePage
或HomePage
。
此类小部件的一个示例是此medium article中的RootPage
。
文章示例:
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();
}
}
}