应用程序检查用户是否登录时颤动启动屏幕

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)