用户成功登录后,我想保持用户登录状态。我正在使用REST API来检索用户的用户名和密码。但是我想保存这些详细信息,以便用户可以保持登录状态。我目前的情况是我可以成功登录用户,但是当我重新启动应用程序时,我必须再次登录,因此我需要将用户的详细信息保存在共享首选项,以便用户可以在整个会话之前保持登录状态,直到注销为止。但是我无法执行此操作,因此请帮助我。提前致谢
这是我登录页面的代码。我删除了应该在列表视图中的UI内容,因为它们并不相关。
Login.dart
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:restaurant_app/globalVar.dart'; import 'package:restaurant_app/homescreen.dart'; import 'package:restaurant_app/models/auth.dart'; import 'package:restaurant_app/signup.dart'; import 'package:http/http.dart' as http; import 'package:restaurant_app/utils/authutils.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SignIn extends StatefulWidget { SignIn({ Key key, this.post }): super(key: key); @override _SignInState createState() => _SignInState(); } class _SignInState extends State<SignIn> with SingleTickerProviderStateMixin { TabController controller; TextEditingController _email = new TextEditingController(); TextEditingController _password = new TextEditingController(); bool loading; final GlobalKey < ScaffoldState > _scaffoldKey = new GlobalKey<ScaffoldState> (); @override void initState() { // TODO: implement initState super.initState(); _fetchSessionAndNavigate(); controller = new TabController(length: 2, vsync: this); loading = false; } @override void dispose() { // TODO: implement dispose super.dispose(); controller.dispose(); setState(() { loading = false; }); _email.dispose(); _password.dispose(); } final GlobalKey < FormState > _formKey = GlobalKey<FormState>(); bool _autoValidate = false; _login(username, password) async { setState(() { loading = true; }); var body = json.encode({ "username": username, "password": password, }); Map < String, String > headers = { 'Content-type': 'application/json', 'Accept': 'application/json', }; await http .post("${GlobalVar.Ip}/wp-json/jwt-auth/v1/token", body: body, headers: headers) .then((response) { var body = json.decode(response.body); //var response1; if (response.statusCode == 200) { // TODO: you need to store body['token'] to use in some authentication loading = false; Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext ctx) => HomePage())); } else { // TODO: alert message final snackBar = SnackBar( content: Text(body['message'].toString().trim()), ); _scaffoldKey.currentState.showSnackBar(snackBar); } setState(() { loading = false; }); }); } @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, resizeToAvoidBottomPadding: false, body: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage('images/art.png'), fit: BoxFit.fill, colorFilter: ColorFilter.mode( Colors.white12.withOpacity(0.2), BlendMode.dstATop), ), ), child: ListView(); }
Login如果用户详细信息已保存在存储器中,则可以导航至该页面,否则将Home使用以下代码导航至该页面
Login
Home
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); SharedPreferences prefs = await SharedPreferences.getInstance(); var email = prefs.getString('email'); print(email); runApp(MaterialApp(home: email == null ? Login() : Home())); }
成功登录后保存所需的用户详细信息
class Login extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: RaisedButton( onPressed: () async { //after the login REST api call && response code ==200 SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString('email', 'useremail@gmail.com'); Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext ctx) => Home())); }, child: Text('Login'), ), ), ); } }
清除注销详细信息
class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home'), ), body: Center( child: RaisedButton( onPressed: () async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.remove('email'); Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext ctx) => Login())); }, child: Text('Logout'), ), ), ); } }
希望能帮助到你!