Flutter-需要帮助正确使用启动屏幕+带有SharedPreferences检查的登录数据



在从SharedPreferences获取isLoggedIn值时,我正试图用3秒计时器显示启动屏幕。我使用的启动屏幕只是一个Spinner。

第一次安装该应用程序时,它运行得很顺利,启动屏幕运行了3秒,导航到LoginPage,我输入了登录凭据。然后,应用程序直接导航到下一个名为/main的页面,其中有3个页面(BottomNavigationBar),/home是其默认索引。

问题是:下次在不重新安装的情况下启动应用程序时,它不会显示任何启动屏幕。它直接进入/main页面。在那之后,我立即尝试通过BottomNavigationBar移动到另一个页面。3秒钟后(我确信这是因为计时器),屏幕自动重新启动并移回/home

这是我的splash_screen_page.dart文件:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:shared_preferences/shared_preferences.dart';
class SplashScreenPage extends StatefulWidget {
const SplashScreenPage({Key? key}) : super(key: key);
@override
State<SplashScreenPage> createState() => _SplashScreenPageState();
}
class _SplashScreenPageState extends State<SplashScreenPage> {
bool isLoggedIn = false;
@override
void initState() {
super.initState();
Timer(Duration(seconds: 3), () {
_navigateUser();
});
}
void _navigateUser() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
if(isLoggedIn){
Navigator.pushReplacementNamed(context, "/main");
}else{
Navigator.pushReplacementNamed(context, "/login");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: EdgeInsets.all(128),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
Container(
child:
// Image(image: AssetImage("assets/splashscreen.png")),
const SpinKitFoldingCube(
color: Colors.blue,
size: 50.0,
))
],
)
)
);
}
}

也许它可以帮助

class _SplashScreenPageState extends State<SplashScreenPage> {
bool isLoggedIn = false;


@override
void initState() {
super.initState();

login().then((value) {
if(isLoggedIn){
Navigator.pushReplacementNamed(context, "/main");
}else{
Navigator.pushReplacementNamed(context, "/login");
}
});

login(){
int _jobsRemained = 2;
while (_jobsRemained > 0) {
if (!isLoggedIn){
SharedPreferences prefs = await SharedPreferences.getInstance();
isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
_jobsRemained--;
}

Future.delayed(Duration(seconds: 3)).then((value) => {_jobsRemained--;});
}

}
}