ПОЛУЧИТЬ запрос во флаттере - PullRequest
0 голосов
/ 23 марта 2020

Я начинаю вчерашний день с флаттера, и сегодня у меня проблема с GET-запросом.

Похоже, я не могу получить данные из своего URL, я понятия не имею, почему, когда я вставляю их в в моем браузере все работает

Я пытался получить один User объект, но у меня ничего не получалось: (

мой код,

User.dart

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

  User(this.id, this.firstName, this.lastName, this.email);

  User.fromJson(Map<String,dynamic> json){
    id = json['id'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    email = json['email'];
  }
}

моя функция GET:

Future<User> getCurrentUser() async {
    String url = 'http://10.0.2.2:80/user/current';
    final response =
        await http.get(url, headers: {"Accept": "application/json"});


    if (response.statusCode == 200) {
      return User.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to load post');
    }
  } 

мой виджет:

class UserPageState extends State<UserPage>{
  Future<List<dynamic>> _user;

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) => Container(
          child: FutureBuilder(
            future: getCurrentUser(),
            builder: (BuildContext context, AsyncSnapshot snapshot){
              if(snapshot.hasData ){
                return Container(
                  child: Center(child: Text(snapshot.data['firstName']),),
                );
              }else {
                return Text('NOT LOAD');
              }
            },
          ),
        ),
      ),
    );
  }
}

когда я вставляю свой url в браузер, он показывает мне:

{
createdAt: 1584905291338,
updatedAt: 1584905291338,
id: 3,
firstName: "name",
lastName: "surname",
email: "surname@name.com",
admin: false
}

Понятия не имею, что я могу сделать, ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ: (

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Прежде всего, я бы порекомендовал вам получать данные из initState в StatefulWidget, а не в методе сборки. В противном случае при каждой перестройке данные извлекаются заново через http.get. В своем виджете FutureBuilder вы используете future: _user

class UserPage extends StatefulWidget {
  UserPage({Key key}) : super(key: key);

  @override
  UserPageState createState() => UserPageState();
}

class UserPageState extends State<UserPage>{
  Future<User> _user;

  @override
  void initState() {
    super.initState();
    _user = getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    ... // your code here

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

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

  User(this.id, this.firstName, this.lastName, this.email);

  factory User.fromJson(Map<String,dynamic> json){
    return User(
      json['id'],
      json['firstName'],
      json['lastName'],
      json['email'],
    );
  }
}
0 голосов
/ 23 марта 2020
class User{
  int id;
  String firstName;
  String lastName;
  String email;

  // For me, it's better to use named parameter to make it easier to read
  User({this.id, this.firstName, this.lastName, this.email});

  // this doesn't return User object
  User.fromJson(Map<String,dynamic> json){
    id = json['id'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    email = json['email'];
  }

  factory User.fromJson(Map<String,dynamic> json){
    return User(
      id: json['id'],
      firstName : json['firstName '],
      lastName : json['lastName '],
      email : json['email '],
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...