Flutter:使用 SharedPreferences 保持用户登录

Zef*_*ndo 2 sharedpreferences dart flutter

我对共享首选项有一些问题。如何通过关闭应用程序让用户登录?

我已经用这个代码存储了用户名:

setState(() {
        preferences.setString('token', dataUser[0]['username']);
        Navigator.of(context).pushAndRemoveUntil(
            PageTransition(
                type: PageTransitionType.rightToLeftWithFade,
                child: HomePage()),
            (Route<dynamic> route) => false);
      });
Run Code Online (Sandbox Code Playgroud)

当我点击按钮登录时,它可以转到主页。为了确保用户名存储/不存储,我使用函数来获取我的令牌并获取该令牌。

我的令牌使用此代码获取我期望的内容:

String checkPref;
  getPrefIdUser() async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
      checkPref = sharedPreferences.getString('token');
      if (checkPref == null) {
        Navigator.of(context).pushAndRemoveUntil(
            PageTransition(
                type: PageTransitionType.leftToRightWithFade,
                child: LoginPage()),
            (Route<dynamic> route) => false);
      } else {
        // Navigator.of(context).pushAndRemoveUntil(
        //     PageTransition(
        //         type: PageTransitionType.leftToRightWithFade,
        //         child: HomePage()),
        //     (Route<dynamic> route) => false);
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

我已经getPrefIdUser()在我的主页中放入了这样的 initState:

 @override
  void initState() {
    super.initState();
    getPrefIdUser();
  }

Run Code Online (Sandbox Code Playgroud)

问题是,当我重新启动我的应用程序(我在真实设备中尝试)时,用户再次返回登录页面。我不知道这是什么问题。

你能帮我解决这个问题吗?谢谢。

这是我的按钮登录功能

void _loginMahasiswa() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    final body = {"email": _txtEmail.text, "password": _txtPassword.text};
    var loginMahasiswa = await api.loginMahasiswa(body);
    String message = loginMahasiswa['message'];
    var dataUser = loginMahasiswa['data'];

    if (loginMahasiswa['status'] == true) {

      setState(() {
        preferences.setString('token', dataUser[0]['username']);
        Navigator.of(context).pushAndRemoveUntil(
            PageTransition(
                type: PageTransitionType.rightToLeftWithFade,
                child: HomePage()),
            (Route<dynamic> route) => false);
      });
    } else {
      print(message);
      _showSnackBar(context, message, Colors.red);
    }
  }
Run Code Online (Sandbox Code Playgroud)

chu*_*han 6

您可以直接在主函数中进行此检查

Future<void> main() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var token = prefs.getString('token');
  print(token);

  runApp(MaterialApp(home: token == null ? Login() : Home()));
}
Run Code Online (Sandbox Code Playgroud)

也参考这个如何使用共享首选项来保持用户登录颤振?