Kev*_*lan 1 splash-screen dart launch-screen flutter
我最近构建了一个颤振应用程序。我有一种方法可以检查用户是否登录并在确认检查后显示适当的屏幕。如果用户未登录,它将返回登录屏幕,但如果用户已经登录,则应显示主屏幕。但是,如果用户已登录,它将在显示主屏幕之前显示登录屏幕一两秒钟。检查用户是否登录的代码
class CheckAuth extends StatefulWidget {
@override
_CheckAuthState createState() => _CheckAuthState();
}
class _CheckAuthState extends State<CheckAuth> {
bool isAuth = false;
@override
void initState() {
super.initState();
_checkIfLoggedIn();
}
void _checkIfLoggedIn() async {
SharedPreferences localStorage = await SharedPreferences.getInstance();
var token = localStorage.getString('token');
if (token != null) {
setState(() {
isAuth = true;
});
}
}
@override
Widget build(BuildContext context) {
Widget child;
if (isAuth) {
child = HomePage();
} else {
child = Login();
}
return Scaffold(
body: child,
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是主要功能代码
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme:
ThemeData(
primarySwatch: Colors.blueGrey,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: CheckAuth(),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在后台执行检查时显示启动屏幕并显示正确的屏幕
小智 5
您正在SharedPreferences.getInstance()您的职能中等待_checkIfLoggedIn()。然而,不能等待这个函数,因为我不相信 flutter 有 async init 函数。
解决方案是使用一个Future构建器,该构建器将根据异步调用的状态显示所需的内容。
有3种可能的状态:
class CheckAuth extends StatefulWidget {
@override
_CheckAuthState createState() => _CheckAuthState();
}
class _CheckAuthState extends State<CheckAuth> {
bool isAuth = false;
Future<bool> loginCheckFuture;
@override
void initState() {
super.initState();
loginCheckFuture = _checkIfLoggedIn();
}
Future<bool> _checkIfLoggedIn() async {
SharedPreferences localStorage = await SharedPreferences.getInstance();
var token = localStorage.getString('token');
if (token != null) {
return true;
}
return false;
}
@override
Widget build(BuildContext context) {
Widget child;
return FutureBuilder(
future: loginCheckFuture,
builder: (context, snapshot){
if(snapshot.hasData){
if(snapshot.data == true){
child = HomePage();
} else {
child = Login();
}
} else{
// future hasnt completed yet
child = yourLoadingWidget();
}
return Scaffold(
body: child,
);
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5104 次 |
| 最近记录: |