这是我的情况:
用户只需选择未使用的用户名并通过验证,即可注册该应用 当用户登录该应用程序时,其userID(我数据库中用户的主键)存储在本地,并用于我的所有服务。
我正在使用SQL Server作为数据库。
我要完成的工作是,一旦用户登录,我想让他保持登录状态,但是我不知道怎么办,因为一旦应用程序在关闭后再次启动,用户名甚至都不会被初始化(直到用户登录为止),所以我不知道我应该在应用程序中自动登录哪个用户。 我该如何解决这个问题(如果可能的话,我宁愿从前端进行此操作,否则,我应该如何在后端进行明智的选择?)
答案 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();
});
}