Как использовать данные пользователя после входа в систему? - PullRequest
0 голосов
/ 16 апреля 2020

Я создал функции для входа пользователя в систему через rest api. и все работает, но я также хочу использовать информацию о моем пользователе, который только что вошел в систему и отобразить ее на главной странице или в ящике, может кто-нибудь есть какие-либо идеи, как это сделать?

мой код:

функция входа:

  signIn(String email, pass) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    Map data = {
      'email': email,
      'password': pass
    };
    var jsonResponse = null;
    var response = await http.post("http://10.0.2.2:80/user/login", body: data);
    if(response.statusCode == 200) {
      jsonResponse = json.decode(response.body);
      if(jsonResponse != null) {
        setState(() {
          _isLoading = true;
        });
        sharedPreferences.setInt("id", jsonResponse['id']);
        Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => MainPage()), (Route<dynamic> route) => false);
      }
    }
    else {
      setState(() {
        _isLoading = false;
      });
      print(response.body);
    }
  }

главная страница после успешного входа в систему:

class _MainPageState extends State<MainPage> {

  SharedPreferences sharedPreferences;

  @override
  void initState() {
    super.initState();
    checkLoginStatus();
  }

  checkLoginStatus() async {
    sharedPreferences = await SharedPreferences.getInstance();
    if(sharedPreferences.getInt("id") == null) {
      Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => LoginPage()), (Route<dynamic> route) => false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Code Land", style: TextStyle(color: Colors.white)),
        actions: <Widget>[
          FlatButton(
            onPressed: () {
              sharedPreferences.clear();
              Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => LoginPage()), (Route<dynamic> route) => false);
            },
            child: Text("Log Out", style: TextStyle(color: Colors.white)),
          ),
        ],
      ),
      body: Center(child: Text("Main Page")),
      drawer: Drawer(),
    );
  }
}

мой пользовательский объект:

  "id": 1,
  "firstName": "admin",
  "lastName": "admin",
  "accountName": "Kot filemon",
  "email": "admin@admin.pl",
  "active": false,
  "activateCode": 0,
  "admin": true,
  "latitude": 000,
  "longitude": 000,
  "profileImage": null

спасибо за любые помощь:)

1 Ответ

1 голос
/ 16 апреля 2020

Это не полный подробный ответ, а способ описания процедуры, которой вы можете следовать.


Что ж, вы можете сохранить информацию о пользователе в своем приложении. Я вижу, что вы только сохраняете ID и используете sharedPreferences в этой строке.

sharedPreferences.setInt("id", jsonResponse['id']);

Другие поля можно сохранить таким же образом, используя тот же способ, который вы используете с ID

sharedPreferences.setString("firstName", jsonResponse['firstName']);
sharedPreferences.setString("lastName", jsonResponse['lastName']);
sharedPreferences.setString("accountName", jsonResponse['accountName']);
sharedPreferences.setString("email", jsonResponse['email']);

Затем на главной странице вам необходимо восстановить эти данные "так же, как вы делаете это в функции checkLoginStatus().

Вам нужен класс для User(), чтобы организовать ваши данные.

class User {
  int id;
  String firstName;
  String email;

  User({this.id, this.firstName, this.email});
}

A getUser(), чтобы получить ваши данные, используя User class

Future<User> getUser() async {
    sharedPreferences = await SharedPreferences.getInstance();

    var id = sharedPreferences.getInt("id");
    var firstName = sharedPreferences.getString("firstName");
    var email = sharedPreferences.getString("email");

    return User(id: id, firstName: firstName, email: email);
  }

и в вашей функции initState () вызовите эту функцию следующим образом:

  SharedPreferences sharedPreferences;
  Future<User> myUser;

  @override
  void initState() {
    super.initState();
    checkLoginStatus();
    myUser = getUser();
  }

Код не проверен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...