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