我正在获取csrf令牌并在控制台中打印响应数据,但是如何使用响应数据保持用户登录。我正在使用状态码进行登录,即,如果状态码为200,则此后移至登录状态。希望让用户保持登录状态,仅在用户要注销时才注销
我看到了很多例子,但对我来说都没有帮助。
在我的情况下,我正在使用csrf令牌,但无法使其保持登录状态,并且我也使用了登录表单。
LoginPage.dart
1[2-90]*
答案 0 :(得分:2)
从api获取响应代码200后,您可以在“共享的偏好设置”中输入一个条目。
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs?.setBool("isLoggedIn", true);
然后您可以从共享首选项检查状态后导航用户
Future<void> main() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var status = prefs.getBool('isLoggedIn') ?? false;
print(status);
runApp(MaterialApp(home: status == true ? Login() : Home()));
}
更新:-
另一种实现方法是,您也可以将逻辑添加到启动屏幕中,并且启动屏幕应该是应用程序中的入口点
class SplashScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _SplashScreenState();
}
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
startTimer();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/clinician_splash.png"),
fit: BoxFit.cover),
),
),
);
}
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') ?? false;
print(status);
if (status) {
Navigation.pushReplacement(context, "/Home");
} else {
Navigation.pushReplacement(context, "/Login");
}
}
}
要注销,请在注销按钮的onPress事件中添加以下功能:
void logoutUser(){
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs?.clear()
Navigator.pushAndRemoveUntil(
context,
ModalRoute.withName("/SplashScreen"),
ModalRoute.withName("/Home")
);
}
答案 1 :(得分:0)
对于登录凭据,我相信您应该使用Flutter Secure Storage,它是ios密钥链和android的AES加密的包装。
https://pub.dev/packages/flutter_secure_storage#-readme-tab-