如何保持用户登录?

时间:2019-04-26 20:13:52

标签: flutter

这是我的情况:

用户只需选择未使用的用户名并通过验证,即可注册该应用 当用户登录该应用程序时,其userID(我数据库中用户的主键)存储在本地,并用于我的所有服务。

我正在使用SQL Server作为数据库。

我要完成的工作是,一旦用户登录,我想让他保持登录状态,但是我不知道怎么办,因为一旦应用程序在关闭后再次启动,用户名甚至都不会被初始化(直到用户登录为止),所以我不知道我应该在应用程序中自动登录哪个用户。 我该如何解决这个问题(如果可能的话,我宁愿从前端进行此操作,否则,我应该如何在后端进行明智的选择?)

1 个答案:

答案 0 :(得分:0)

您可以使用共享首选项来保存用户ID,因为您正在使用SQL Server DB,也许您还将提供一个令牌,并且也需要存储该令牌。

在用户首次登录后,成功完成登录后保存数据。

import 'package:shared_preferences/shared_preferences.dart';

 var _prefs = SharedPreferences.getInstance();

  /// ----------------------------------------------------------
  /// Method that saves the token (if you need the token) and userID in Shared Preferences
  /// ----------------------------------------------------------
  Future<bool> _setMobileToken(String token , String username, String userID) async {
    final SharedPreferences prefs = await _prefs;
    prefs.setString("username", username);
    prefs.setString("userID", userID);
    return prefs.setString(_storageKeyMobileToken, token);
  }

之后,当您关闭应用程序并再次打开时,您只需要从“共享首选项”中读取数据即可。

    // Async function that calls getSharedPreferences
  awaitSharedPref() async {
    await getSharedPreferences();
  }


  // Get the username and token from SharedPreferences and check if the token is valid
  awaitToken() async {
    await functions.getMobileToken();

    if (token != "" && token != null && username!= "" && username!= null ) {

        // If you use any token try to make a validation if was expired or not 
        //_presenter.validateToken(token, username.toString());

        // If not redirect the user directly on the home page 
        Navigator.of(_ctx).pushReplacementNamed("/home");

    } else {
      Navigator.of(context).pushNamed("/login");
    }

  }

如果您愿意,还可以添加“记住我”复选框,因此即使他下次下次从应用程序注销时也可以打开它,也可以直接单击具有用户名的“登录”按钮并通过自动填充。

    final rememberMe = CheckboxListTile(
  value: checkValue,
  onChanged: _onChanged,
  title: new Text("Remember me", style: new TextStyle(
      color: Colors.blueGrey[600], fontStyle: FontStyle.italic),),
  controlAffinity: ListTileControlAffinity.leading,
);


_onChanged(bool value) async {
    sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
      checkValue = value;
      sharedPreferences.setBool("check", checkValue);
      sharedPreferences.setString("username", username.text);
      sharedPreferences.setString("password", password.text);
      getCredential();
    });
}