Flutter: Отображение JSON в список объектов возвращает null

#json #flutter #parsing #dart #flutter-futurebuilder

#json #флаттер #синтаксический анализ #dart #flutter-futurebuilder

Вопрос:

У меня есть json структуры

 {
  "message": "",
  "status" : "complete",
  "results": [
      {
        "id": 66,
        "user": {
            "id": 80,
            "email": " fsefs@gmail.com"
        },
          "order": {
              "id": 1,
              "customer": 2,
              "receiver_name": "Something",
              "receiver_phone_number": "464"
        },
          "order": {
              "id": 1,
              "customer": 2,
              "receiver_name": "Something",
              "receiver_phone_number": "464"
          },
          "pickedup_time": "sksjkns",
          "delivered_time": "hkvjsfsf"
      }
    ]
  }

  

и я разбираю json таким образом, а также пытаюсь отобразить его в список объектов

 Future<void> get() async{
  res = await http.get(url);
  var json = jsonDecode(res.body);
  objectsJson = json['results'] as List;
  objects = List<Object>.from(objectsJson.map((i) => Object.fromMap(i))).toList();
}
  

где res, objectsJson, объекты являются глобальными переменными, объявленными как

 var res;
List<Object> objects;
var objectsJson;
  

и это мой класс для объекта с методом fromMap, который я использую для создания классов

 class Object{
  int id, customer;
  String 
      receiverName,
      receiverPhoneNumber,
      pickedUpTime,
      deliveredTime;

  Object(
        {
        int id,
          int customer,
          String receiverName,
          String receiverPhoneNumber,
          String pickedUpTime,
          String deliveredTime
        }
        );


  factory Object.fromMap(Map<String, dynamic> json) {

    print(json['order']['id'].toString() 
        json['order']['customer'].toString() 
        json['order']['receiver_name'].toString() 
        json['order']['receiver_phone_number'].toString() 
        json['pickedup_time'].toString() 
        json['delivered_time'].toString()
        );

    return new Object(
        id: json['order']['id'],
        customer: json['order']['customer'],
        receiverName: json['order']['receiver_name'],
        receiverPhoneNumber: json['order']['receiver_phone_number'],
        pickedUpTime: json['pickedup_time'],
        deliveredTime: json['delivered_time']
        );
  }
}
  

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

 FutureBuilder(
  future: get(),
  build: (BuildContext context, AsyncSnapshot snapshot){
    if(snapshot.connectionState == ConnectionState.done){
      print(objects[0].id);
      print(objects[0].customer); 
      print(objects[0].receiverName);
      print(objects[0].receiverPhoneNumber);
      print(objects[0].pickedUpTime);
      print(objects[0].receivdeliveredTimeerName);
      return Container();
    }
    return Container();
  }

}

  

я распечатал json, и он не поврежден, и это может быть подкреплено получением не null, а фактических значений, когда я распечатываю значения перед возвратом объекта в класс.

я попытался распечатать объекты после отображения, и это то, что я получаю

 ['Instance of Object']
  

я также пытался добавить .toString() к тем, которые являются строками при возврате объекта. Например:

 receiverName: json['order']['receiver_name'].toString()
  

Я не знаю, откуда берется нуль.

Комментарии:

1. Не называйте свой класс ‘Object’ . Класс объекта — это класс верхнего уровня, от которого неявно наследуется каждый класс

2. Я не называл это object. я только изменил его на object для публикации здесь.

Ответ №1:

Попробуйте

В вашем State

 Future<void> get() async{
  res = await http.get(url);
  var json = jsonDecode(res.body);
  objectsJson = json['results'] as List;
  setState((){
    objects = List<Object>.from(objectsJson.map((i) => Object.fromMap(i))).toList();});
}

List<Object> objects = [];


@override
initState(){
 get();
}
  

Тогда вы можете использовать Builder вместо FutureBuilder

 Builder(
 builder: (context){
   if(objects.isEmpty){
      return Container();
   }
   print(objects[0].id);
   print(objects[0].customer); 
   print(objects[0].receiverName);
   print(objects[0].receiverPhoneNumber);
   print(objects[0].pickedUpTime);
   print(objects[0].receivdeliveredTimeerName);
   return Container();
 }
)
  

Комментарии:

1. я тоже пробовал это. речь шла не об обновлении пользовательского интерфейса, а о фактических значениях в объекте,

Ответ №2:

забавно, что я только что нашел решение. я изменил свою функцию FromJSON на использование this.variableName для присвоения значений

 Object.fromJson(Map json) {
      this.id=json['order']['id'];
      this.customer=json['order']['customer'];
      this.receiverName=json['order']['receiver_name'].toString();
      this.receiverPhoneNumber=json['order']['receiver_phone_number'].toString();
      this.pickedUpTime=json['pickedup_time'].toString();
      this.deliveredTime=json['delivered_time'].toString();
  }