How to use shared preferences to keep user logged in flutter?

后端 未结 5 1969
长发绾君心
长发绾君心 2020-11-30 02:35

I want to keep the user logged in after the user successfully logsin in flutter. I am using a REST API to retrieve the user name and password of the user. But I want to save

相关标签:
5条回答
  • 2020-11-30 03:06

    Use user sessions instead. Check out Consession. The package adds user session support in Flutter and is easy to use.

    // Store value to session
    await Consession().set("token", myJWTToken);
    
    // Retrieve item from session
    dynamic token = await Consession().get("token");
    
    0 讨论(0)
  • 2020-11-30 03:12

    Make sure WidgetFlutterBinding.ensureInitialized() is the first line of main()

    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:flutter/material.dart';
    
    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
      SharedPreferences prefs = await SharedPreferences.getInstance();
      bool login = prefs.getBool("login");
      print("login:" + login.toString());
      runApp(MaterialApp(home: login == null ? LoginPage(title: 'My App') : HomePage()));
    }
    
    class LoginPage extends StatelessWidget { ...
    
    0 讨论(0)
  • 2020-11-30 03:12

    Concession is now deprecated in favour of flutter_session. We can now use flutter_session to manage user sessions seamlessly.

    //Write values to the session: 
    await FlutterSession().set("token", myJWTToken);
    
    //Read values from the session: 
    dynamic token = await FlutterSession().get("token");
    
    0 讨论(0)
  • 2020-11-30 03:24

    You can navigate to the Login page if the user details are saved in the storage else to the Home page with the below code

      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()));
        }
    

    Save the required user details after the successful login

    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'),
            ),
          ),
        );
      }
    }
    

    clear the details on logout

    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'),
            ),
          ),
        );
      }
    }
    

    Hope it helps!

    0 讨论(0)
  • 2020-11-30 03:24

    The above answers using SharedPreferences works (make sure you have WidgetsFlutterBinding.ensureInitiazed(); as your first line of main), but it will give you a null on re-start, ie, if you remove the app from recent and re-open it again, it will not re-direct you to the Home or Profile Page. I solved this issue by giving write external storage permission to your app because the shared preferences need to write the data somewhere in your device or emulator.

    Just add the write and read external storage permissions in your Android Manifest file and you can use permission_handler plugin for flutter from pub.dev to get the required permissions from user at runtime when the app is opened for the first time and then Shared Preferences won't give you null.

    0 讨论(0)
提交回复
热议问题