Flutter - 需要有关正确使用启动画面 + 登录数据和 SharedPreferences 检查的帮助
Flutter - Need help on a proper way to use splash screen + Login data with SharedPreferences checking
我试图在从 SharedPreferences
获取 isLoggedIn
值的同时显示 3 秒 Timer 的启动画面。我使用的启动画面只是一个 Spinner。
第一次安装该应用程序时,启动画面很顺利 运行 3 秒钟,然后导航到 LoginPage
,然后我输入了登录凭据。然后应用程序直接导航到名为 /main
的下一个页面,其中有 3 个页面 (BottomNavigationBar
),默认索引为 /home
。
问题是:下次我启动应用程序时没有重新安装,它没有显示任何启动画面。它直接进入了 /main
页面。之后我立即尝试通过 BottomNavigationBar
移动到另一个页面。然后在 3 秒后(我确定是因为 Timer),屏幕自动重新启动并移回 /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--;});
}
}
}
我试图在从 SharedPreferences
获取 isLoggedIn
值的同时显示 3 秒 Timer 的启动画面。我使用的启动画面只是一个 Spinner。
第一次安装该应用程序时,启动画面很顺利 运行 3 秒钟,然后导航到 LoginPage
,然后我输入了登录凭据。然后应用程序直接导航到名为 /main
的下一个页面,其中有 3 个页面 (BottomNavigationBar
),默认索引为 /home
。
问题是:下次我启动应用程序时没有重新安装,它没有显示任何启动画面。它直接进入了 /main
页面。之后我立即尝试通过 BottomNavigationBar
移动到另一个页面。然后在 3 秒后(我确定是因为 Timer),屏幕自动重新启动并移回 /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--;});
}
}
}