繁体   English   中英

flutter如何使用共享首选项一次性登录?

[英]How to use shared preferences to have a one-time login in flutter?

我搜索了 google/stackoverflow 并尝试了很多但没有任何效果。 这是我想要的流程:

  1. 用户启动应用程序。 启动画面出现。
  2. 初始屏幕后出现登录屏幕。 用户登录。
  3. 用户杀死(关闭)应用程序。
  4. 当用户重新启动应用程序时,它应该显示启动画面,然后是主页,因为用户之前已经登录过一次。
  5. 用户只有在注销后才能看到登录页面。

到目前为止 1 和 2 有效。 但是当用户终止/关闭应用程序并再次重新启动它时,他们不会被定向到主页,而是再次被定向到登录页面。

启动画面的代码:

class _SplashScreenState extends State<SplashScreen> {
@override

void initState() {
super.initState();
startTimer();}



@override
Widget build(BuildContext context) {
return Scaffold(
  body: Center(
    child: Container(
      height: 150,
      width: 150,
      child: new SvgPicture.asset(
          'assets/logo.png'
      ),
    ),
    ),
);
}
void startTimer() {
Timer(Duration(seconds: 3), () {
  navigateUser(); //It will redirect  after 3 seconds
});
}
void navigateUser() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
var status = prefs.getBool('isLoggedIn');
print(status);
if (status == true) {
  Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => HomePage());
} else {
  Navigator.pushReplacement(context,  MaterialPageRoute(builder: (BuildContext context) => LoginScreen()));
}
}}

注销按钮的代码:

void logoutUser() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs?.clear();
Navigator.pushAndRemoveUntil(
    context,
    MaterialPageRoute(builder: (BuildContext context) => SplashScreen()),
   
    ModalRoute.withName("/login"),
);
}

对于冗长的帖子感到抱歉,如果有人能指出我哪里出错了,我将非常感谢您的帮助。 或者flutter有没有其他方法可以实现一次性登录,谢谢!

我知道我的回答现在晚了。 但是,如果您使用的是 FirebaseAuth,这将自动缓存您的登录、注销日志。 所以你不需要将它存储到 pref。 只需在启动屏幕时执行额外的步骤以检查用户的最后状态是登录还是通过以下方式注销。 并且此信息可用于重定向到所需的屏幕。

代码:

    Future<bool> checkIfAlreadySignedIn () async {
  late bool _isAlreadySignedIn;
  await FirebaseAuth.instance
      .authStateChanges()
      .listen((event) async {
    if (event == null) {
           print('Currentyl signed out');
      _isAlreadySignedIn = false;
    } else {
      _isAlreadySignedIn = true;
    }
  });
  return _isAlreadySignedIn;
}

您在哪里将“isLoggedIn”首选项设置为 true?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM