无法加载 JSON 数据以在 ListView 中显示

Posted

技术标签:

【中文标题】无法加载 JSON 数据以在 ListView 中显示【英文标题】:Unable to load JSON data to show in ListView 【发布时间】:2020-09-24 23:24:15 【问题描述】:

我需要通过提供get方法来获取flutter app中的json数组数据。

我面临的问题是我无法将记录放在空列表 carList 中。

但我得到了如下所示的对象数组(邮递员)

print(json.decode(response.body)) // 在cars.dart文件中

因此,如果您能帮助我了解如何在 List carlist = [];

中获得响应

Car_list.dart 文件调用 get 请求的方法。

如果您需要我提供任何进一步的信息,请告诉我。

谢谢

邮递员

[

"id": "1",
"carModel" : "Maruti swift",
"carDescription" : "The car has a top speed of 180 km/hr"
,

"id": "1",
"carModel" : "Hyundai santro",
"carDescription" : "The car has a top speed of 150 km/hr"
,

"id": "1",
"carModel" : "Hyundai creta",
"carDescription" : "The car has a top speed of 160 km/hr"

]

CarsModel.dart

class Cars with ChangeNotifier
   String userId;
   String carModel
   String carDescription;


  Cars(
  
    this.userId = '1111',
    this.carModel,
    this.carDescription,
  
);

 factory Cars.fromJSON(Map<String,dynamic> json) => Cars(
     userId : json['userId'],
     carModel : json['CarModel'],
     carDescription : json['carDescription'],
 );


toJSON() 
  return 
    'userId':'111',
    'carModel':carModel,
    'carDescription' : carDescription
  ;

cars.dart

class CarProvider with ChangeNotifier

List<Cars> carlist = [
//Sample data to show the format in which the data needs to be shown as the listview gets populated from below records which we are supposed to get from postman 
//Cars (
//    userid: 1111,
//    carModel: 'Maruti Alto',
//    carDescription: 'Top speed 140 km/hr'


    ),
];

Future<void> readListofCars(int id) async 

 print(id.toString());


 const url = 'http://localhost/userlist';

// 'id': id.toString()

 Map<String, String> headers =    
"Content-type": "application/json";

try
  
  final response = await http.get(url,headers: headers);

  List<dynamic> bodyCars = jsonDecode(response.body);

  List<Cars> loadedCars = bodyCars.map((dynamic item) => new Cars.fromJSON(item)).toList();


  /*
    for (Map i in bodyCars) 
    _notificationitems.add(Cars.fromJSON(i));
  
 */

  );

 print(response.statusCode);
  carlist  = loadedCars; 
 print(json.decode(response.body));
 notifyListeners();

catch (error)
  throw error;


Car_list.dart

class TabScreenCar extends StatefulWidget 

  final String userId;


  TabScreenCar(this.userId);

  @override
  _TabScreenCarState createState() => _TabScreenCarState();


class _TabScreenCarState extends State<TabScreenCar> 
@override
void didChangeDependencies() 
   final id = 1111;
    Provider.of<CarProvider>(context).readListofCars(id);

  super.didChangeDependencies(); 

【问题讨论】:

你能打印出cars.dart的catch块中的错误吗 嗨 wilson....我没有收到任何错误.....所以似乎数据没有插入到列表中,因此列表返回空,结果列表视图为空 【参考方案1】:

在您的模型类中,您获取 json 数据的变量不正确

为了简化流程,您可以查看此链接

https://***.com/a/58708634/9236994

只需将您的json response 粘贴到https://javiercbk.github.io/json_to_dart/

并使用将生成的json模型类。

您的问题将得到解决。

您使用的变量与您的 json 响应不匹配

或者保持简单

使用下面提到的fromJSON方法

factory Cars.fromJSON(Map<String,dynamic> json) => Cars(
     userId : json['id'],
     carModel : json['carModel'],
     carDescription : json['carDescription'],
 );

编辑

我认为您也面临在列表变量中设置数据的问题。

如果汽车数据,使用下面显示的代码将响应填充到列表中

List<Cars> loadedCars = List<Cars>();
var data = jsonDecode(response.body);

data.forEach((val) 
    loadedCars.add(Cars.fromJSON(val));

【讨论】:

嗨,vicky 做了相关的更改,但仍然面临同样的问题 嗨@akhilmodi 我已经在我的回答中添加了一个关于填写列表的编辑,请检查一下。

以上是关于无法加载 JSON 数据以在 ListView 中显示的主要内容,如果未能解决你的问题,请参考以下文章

我有一个包含在 ScrollView 中的 ListView 以在标题下显示字符串列表,但无法正确显示

在listview中向下滚动时如何加载更多项?

Android之ListView&Json加载网络数据

从服务器 json 响应延迟加载 listview 项

如何创建“另存为”和“加载”对话框以在 javascript 中创建/加载 json 文件/数据?

无法通过拉取刷新我的 JSON 数据以在 tableview 控制器中刷新