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--;});
        }
        
    }
  }