Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 当应用程序检查登录状态时,如何设置加载屏幕?_Flutter_Dart - Fatal编程技术网

Flutter 当应用程序检查登录状态时,如何设置加载屏幕?

Flutter 当应用程序检查登录状态时,如何设置加载屏幕?,flutter,dart,Flutter,Dart,我使用SharedReferences来保持登录状态。它很好用 但当我打开这个时,关闭我的应用程序。它把我所有的屏幕都显示出来,就像闪屏一样,然后它就停留在右边的屏幕上 但是我不想要这个,这个不好 我想当应用程序检查登录状态时,它会显示一个加载屏幕或任何东西,然后在完成其显示应用程序右屏幕 我该怎么做 这是我的登录状态检查代码 checkLoginStatus() async { sharedPreferences = await SharedPreferences.getInstan

我使用SharedReferences来保持登录状态。它很好用

但当我打开这个时,关闭我的应用程序。它把我所有的屏幕都显示出来,就像闪屏一样,然后它就停留在右边的屏幕上

但是我不想要这个,这个不好

我想当应用程序检查登录状态时,它会显示一个加载屏幕或任何东西,然后在完成其显示应用程序右屏幕

我该怎么做

这是我的登录状态检查代码

 checkLoginStatus() async {
    sharedPreferences = await SharedPreferences.getInstance();

if (sharedPreferences.getString("empid") == null) {
  Navigator.of(context).pushAndRemoveUntil(
      MaterialPageRoute(builder: (BuildContext context) => Home()),
      (Route<dynamic> route) => false);
   }
}
checkLoginStatus()异步{
SharedReferences=等待SharedReferences.getInstance();
if(sharedReferences.getString(“empid”)==null){
Navigator.of(context).pushandremoveintil(
MaterialPackageRoute(生成器:(BuildContext上下文)=>Home()),
(路由)=>false);
}
}

个人而言,我喜欢使用变量\u isLoading,我在使用设置状态的登录方法开始时将其设置为true。然后使用这个bool,您只需更改脚手架中显示的内容

bool _isLoading = false;

checkLoginStatus() async {
    setState() => _isLoading = true;
    sharedPreferences = await SharedPreferences.getInstance();

    if (sharedPreferences.getString("empid") == null) {
        Navigator.of(context).pushAndRemoveUntil(
            MaterialPageRoute(builder: (BuildContext context) => Home()),
           (Route<dynamic> route) => false);
    } else {
        setState() => _isLoading = false;
    }
}

MycurrentUser只是我创建的一个类,它包含一个enumAuthStatus,其值可以是notSignedInsignedIn。如果在加载时将状态设置为null,则可以显示加载屏幕。

代码段

void main async {

bool isUserLogin = await User.isUserLogin();
  if (isUserLogin) { // wait untill user details load
    await User.currentUser.loadPastUserDetails();
  }

  runApp(MyApp(isUserLogin));

}


希望这有帮助

您是否已为store user pref details创建了singleton类?这是一个简单的方法,代码似乎是正确的,只需在按下并移动之前重置详细信息,直到我已经有了这个。。兄弟我只是在寻找时检查登录状态我需要显示加载屏幕。当应用程序找到正确的状态,然后加载停止和停留。你遵循集团模式吗?ScopedModel brother?你想要这样的东西,第一次显示登录屏幕,然后每次回来,然后显示主屏幕?我知道这一点,我的兄弟。当应用程序打开时,它的第一选择是登录屏幕。但如果用户已经登录。应用程序不显示第一次主屏幕首先显示其登录屏幕,然后在checklogin状态检测到有已登录的用户时,自动通过主屏幕。但我想,如果用户已经登录,我只是第一次显示我的主屏幕或加载。但首先,如果用户已经登录,它会显示我的登录屏幕,这就是问题所在。在这种情况下,您可以使用一个页面来构建登录页面(如果用户未连接)、登录时的主屏幕和加载时的加载屏幕,而其他两种情况都无效。
void main async {

bool isUserLogin = await User.isUserLogin();
  if (isUserLogin) { // wait untill user details load
    await User.currentUser.loadPastUserDetails();
  }

  runApp(MyApp(isUserLogin));

}
class MyApp extends StatelessWidget {

  bool isUserLogin;
  MyApp(this.isUserLogin);

  @override
  Widget build(BuildContext context) {
    var defaultRoot = isUserLogin ? HomePage() : LoginScreen();

    final material =  MaterialApp(
      debugShowCheckedModeBanner: false,
      home: defaultRoot,
    );

    return material;
  }
}