Json Model类没有获取列表接收器实例

时间:2020-06-16 15:49:41

标签: json flutter dart flutter-layout

简单的JSON数据获取并在屏幕上显示,数据正在打印中显示,但在屏幕上显示NoSuchMethodErrorClass'ResponsiveObjectSettingByUser'的给定错误时,没有实例方法“ car”接收者:实例,

获取功能

--cb_type dm

初始化

--cb_type

模型类(ResponseObjectSettingByUser)

--cb_type

使用

在屏幕上显示数据
Future<ResponseObjectSettingByUser> _list;
  final String _url = '<LINK>';


Future<ResponseObjectSettingByUser> getUserSettings() async {
    ResponseObjectSettingByUser responseData = null;

    var response = await http
        .get(_url + '<link>', headers: {
      "Authorization":
          'Bearer <TOKEN>',
    });

     var responseJson = json.decode(response.body);
    if (response.statusCode == 200) {
      responseJson = settingByUserModel(response.body);
      print(responseJson.toJson().toString());
    }
    return responseJson;
  }

JSON数据就是这样。

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

       _list = getUserSettings();
  }

1 个答案:

答案 0 :(得分:0)

您可以在下面复制粘贴运行完整代码
您可以在AsyncSnapshot<ResponseObjectSettingByUser>中使用connectionState并选中snapshot.data.array.car.length并使用ListView

代码段

FutureBuilder(
    future: _list,
    builder:
        (context, AsyncSnapshot<ResponseObjectSettingByUser> snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.none:
          return Text('none');
        case ConnectionState.waiting:
          return Center(child: CircularProgressIndicator());
        case ConnectionState.active:
          return Text('');
        case ConnectionState.done:
          if (snapshot.hasError) {
            return Text(
              '${snapshot.error}',
              style: TextStyle(color: Colors.red),
            );
          } else {
            return ListView.builder(
                itemCount: snapshot.data.array.car.length,
                itemBuilder: (context, index) {

工作演示

enter image description here

完整代码

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

ResponseObjectSettingByUser settingByUserModel(String str) =>
    ResponseObjectSettingByUser.fromJson(json.decode(str));

String welcomeToJson(ResponseObjectSettingByUser data) =>
    json.encode(data.toJson());

class ResponseObjectSettingByUser {
  ResponseObjectSettingByUser({
    this.array,
  });

  Array array;

  factory ResponseObjectSettingByUser.fromJson(Map<String, dynamic> json) =>
      ResponseObjectSettingByUser(
        array: Array.fromJson(json["array"]),
      );

  Map<String, dynamic> toJson() => {
        "array": array.toJson(),
      };
}

class Array {
  Array({
    this.car,
  });

  List<Car> car;

  factory Array.fromJson(Map<String, dynamic> json) => Array(
        car: List<Car>.from(json["car"].map((x) => Car.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "car": List<dynamic>.from(car.map((x) => x.toJson())),
      };
}

class Car {
  Car({
    this.id,
    this.name,
    this.numberKmsMin,
    this.numberKmsMax,
    this.priceMin,
    this.priceMax,
    this.powerHorseMin,
    this.powerHorseMax,
    this.status,
    this.isSaved,
    this.markId,
    this.markName,
    this.markImageUrl,
    this.modelId,
    this.modelName,
    this.modelImageUrl,
    this.bodyworkId,
    this.bodyworkName,
    this.fuelId,
    this.fuelName,
    this.motorizationId,
    this.motorizationName,
    this.rimsId,
    this.rimsName,
    this.serieId,
    this.serieName,
    this.interiorEquipmentId,
    this.interiorEquipmentName,
    this.upholsteryId,
    this.upholsteryName,
    this.upholsteryLeatherFabricName,
    this.iluminationId,
    this.iluminationName,
    this.externalEquipmentId,
    this.externalEquipmentName,
    this.dateStartMin,
    this.dateEndMax,
    this.settings,
  });

  int id;
  String name;
  String numberKmsMin;
  String numberKmsMax;
  String priceMin;
  String priceMax;
  String powerHorseMin;
  String powerHorseMax;
  String status;
  int isSaved;
  int markId;
  String markName;
  String markImageUrl;
  int modelId;
  String modelName;
  String modelImageUrl;
  int bodyworkId;
  String bodyworkName;
  int fuelId;
  String fuelName;
  int motorizationId;
  String motorizationName;
  dynamic rimsId;
  dynamic rimsName;
  int serieId;
  String serieName;
  int interiorEquipmentId;
  String interiorEquipmentName;
  int upholsteryId;
  String upholsteryName;
  String upholsteryLeatherFabricName;
  int iluminationId;
  String iluminationName;
  int externalEquipmentId;
  String externalEquipmentName;
  String dateStartMin;
  String dateEndMax;
  List<Setting> settings;

  factory Car.fromJson(Map<String, dynamic> json) => Car(
        id: json["id"],
        name: json["name"],
        numberKmsMin: json["number_kms_min"],
        numberKmsMax: json["number_kms_max"],
        priceMin: json["price_min"],
        priceMax: json["price_max"],
        powerHorseMin: json["power_horse_min"],
        powerHorseMax: json["power_horse_max"],
        status: json["status"],
        isSaved: json["is_saved"],
        markId: json["mark_id"],
        markName: json["mark_name"],
        markImageUrl: json["mark_image_url"],
        modelId: json["model_id"],
        modelName: json["model_name"],
        modelImageUrl: json["model_image_url"],
        bodyworkId: json["bodywork_id"],
        bodyworkName: json["bodywork_name"],
        fuelId: json["fuel_id"],
        fuelName: json["fuel_name"],
        motorizationId: json["Motorization_id"],
        motorizationName: json["Motorization_name"],
        rimsId: json["rims_id"],
        rimsName: json["rims_name"],
        serieId: json["serie_id"],
        serieName: json["serie_name"],
        interiorEquipmentId: json["Interior_equipment_id"],
        interiorEquipmentName: json["Interior_equipment_name"],
        upholsteryId: json["Upholstery_id"],
        upholsteryName: json["Upholstery_name"],
        upholsteryLeatherFabricName: json["Upholstery_Leather_fabric_name"],
        iluminationId: json["ilumination_id"],
        iluminationName: json["ilumination_name"],
        externalEquipmentId: json["external_equipment_id"],
        externalEquipmentName: json["external_equipment_name"],
        dateStartMin: json["date_start_min"],
        dateEndMax: json["date_end_max"],
        settings: json["settings"] == null
            ? null
            : List<Setting>.from(
                json["settings"].map((x) => Setting.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "number_kms_min": numberKmsMin,
        "number_kms_max": numberKmsMax,
        "price_min": priceMin,
        "price_max": priceMax,
        "power_horse_min": powerHorseMin,
        "power_horse_max": powerHorseMax,
        "status": status,
        "is_saved": isSaved,
        "mark_id": markId,
        "mark_name": markName,
        "mark_image_url": markImageUrl,
        "model_id": modelId,
        "model_name": modelName,
        "model_image_url": modelImageUrl,
        "bodywork_id": bodyworkId,
        "bodywork_name": bodyworkName,
        "fuel_id": fuelId,
        "fuel_name": fuelName,
        "Motorization_id": motorizationId,
        "Motorization_name": motorizationName,
        "rims_id": rimsId,
        "rims_name": rimsName,
        "serie_id": serieId,
        "serie_name": serieName,
        "Interior_equipment_id": interiorEquipmentId,
        "Interior_equipment_name": interiorEquipmentName,
        "Upholstery_id": upholsteryId,
        "Upholstery_name": upholsteryName,
        "Upholstery_Leather_fabric_name": upholsteryLeatherFabricName,
        "ilumination_id": iluminationId,
        "ilumination_name": iluminationName,
        "external_equipment_id": externalEquipmentId,
        "external_equipment_name": externalEquipmentName,
        "date_start_min": dateStartMin,
        "date_end_max": dateEndMax,
        "settings": settings == null
            ? null
            : List<dynamic>.from(settings.map((x) => x.toJson())),
      };
}

class Setting {
  Setting({
    this.id,
    this.name,
  });

  int id;
  String name;

  factory Setting.fromJson(Map<String, dynamic> json) => Setting(
        id: json["id"],
        name: json["name"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
      };
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  Future<ResponseObjectSettingByUser> _list;

  Future<ResponseObjectSettingByUser> getUserSettings() async {
    ResponseObjectSettingByUser responseData = null;

    /*var response = await http
        .get(_url + '<link>', headers: {
      "Authorization":
      'Bearer <TOKEN>',
    });*/

    String jsonString = '''
    {
    "array": {
        "car": [
            {
                "id": 131,
                "name": "120",
                "number_kms_min": "1000",
                "number_kms_max": "10000",
                "price_min": "10000",
                "price_max": "1000",
                "power_horse_min": "100",
                "power_horse_max": "120",
                "status": "1",
                "is_saved": 0,
                "mark_id": 1,
                "mark_name": "BMW",
                "mark_image_url": "https://cdn0.iconfinder.com/data/icons/car-brands/550/BMW_logo-512.png",
                "model_id": 1,
                "model_name": "Serie 1",
                "model_image_url": "https://www.bmw.pt/content/dam/bmw/common/all-models/1-series/5-door/2019/navigation/bmw-1-series-modelfinder.png",
                "bodywork_id": 1,
                "bodywork_name": "Coupé",
                "fuel_id": 1,
                "fuel_name": "Gasolina",
                "Motorization_id": 1,
                "Motorization_name": "Manual",
                "rims_id": 1,
                "rims_name": "Preto fosco\r\n5 raios",
                "serie_id": 1,
                "serie_name": "120",
                "Interior_equipment_id": 1,
                "Interior_equipment_name": "Bancos desportivos\r\n",
                "Upholstery_id": 1,
                "Upholstery_name": "Preto",
                "Upholstery_Leather_fabric_name": "Preto",
                "ilumination_id": 1,
                "ilumination_name": "Iluminação ambiente",
                "external_equipment_id": 1,
                "external_equipment_name": "Para-choques desportivos",
                "date_start_min": "03/18",
                "date_end_max": "09/19"
            },
            {
                "id": 121,
                "name": "120",
                "number_kms_min": "1000",
                "number_kms_max": "10000",
                "price_min": "10000",
                "price_max": "1000",
                "power_horse_min": "100",
                "power_horse_max": "120",
                "status": "1",
                "is_saved": 0,
                "mark_id": 1,
                "mark_name": "BMW",
                "mark_image_url": "https://cdn0.iconfinder.com/data/icons/car-brands/550/BMW_logo-512.png",
                "model_id": 1,
                "model_name": "Serie 1",
                "model_image_url": "https://www.bmw.pt/content/dam/bmw/common/all-models/1-series/5-door/2019/navigation/bmw-1-series-modelfinder.png",
                "bodywork_id": 1,
                "bodywork_name": "Coupé",
                "fuel_id": 1,
                "fuel_name": "Gasolina",
                "Motorization_id": 1,
                "Motorization_name": "Manual",
                "rims_id": 1,
                "rims_name": "Preto fosco\r\n5 raios",
                "serie_id": 1,
                "serie_name": "120",
                "Interior_equipment_id": 1,
                "Interior_equipment_name": "Bancos desportivos\r\n",
                "Upholstery_id": 1,
                "Upholstery_name": "Preto",
                "Upholstery_Leather_fabric_name": "Preto",
                "ilumination_id": 1,
                "ilumination_name": "Iluminação ambiente",
                "external_equipment_id": 1,
                "external_equipment_name": "Para-choques desportivos",
                "date_start_min": "03/18",
                "date_end_max": "09/19"
            },
            {
                "id": 111,
                "name": "120",
                "number_kms_min": "1000",
                "number_kms_max": "10000",
                "price_min": "10000",
                "price_max": "1000",
                "power_horse_min": "100",
                "power_horse_max": "120",
                "status": "1",
                "is_saved": 0,
                "mark_id": 1,
                "mark_name": "BMW",
                "mark_image_url": "https://cdn0.iconfinder.com/data/icons/car-brands/550/BMW_logo-512.png",
                "model_id": 1,
                "model_name": "Serie 1",
                "model_image_url": "https://www.bmw.pt/content/dam/bmw/common/all-models/1-series/5-door/2019/navigation/bmw-1-series-modelfinder.png",
                "bodywork_id": 1,
                "bodywork_name": "Coupé",
                "fuel_id": 1,
                "fuel_name": "Gasolina",
                "Motorization_id": 1,
                "Motorization_name": "Manual",
                "rims_id": 1,
                "rims_name": "Preto fosco\r\n5 raios",
                "serie_id": 1,
                "serie_name": "120",
                "Interior_equipment_id": 1,
                "Interior_equipment_name": "Bancos desportivos\r\n",
                "Upholstery_id": 1,
                "Upholstery_name": "Preto",
                "Upholstery_Leather_fabric_name": "Preto",
                "ilumination_id": 1,
                "ilumination_name": "Iluminação ambiente",
                "external_equipment_id": 1,
                "external_equipment_name": "Para-choques desportivos",
                "date_start_min": "03/18",
                "date_end_max": "09/19"
            }
        ]
    }
}
    ''';

    http.Response response = http.Response(jsonString, 200);
    if (response.statusCode == 200) {
      String postProcessing =
          response.body.replaceAll('\n', "").replaceAll('\r', "");
      var responseJson = settingByUserModel(postProcessing);
      print(responseJson.toJson().toString());
      return responseJson;
    }
  }

  @override
  void initState() {
    _list = getUserSettings();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
            future: _list,
            builder:
                (context, AsyncSnapshot<ResponseObjectSettingByUser> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('none');
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                case ConnectionState.active:
                  return Text('');
                case ConnectionState.done:
                  if (snapshot.hasError) {
                    return Text(
                      '${snapshot.error}',
                      style: TextStyle(color: Colors.red),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data.array.car.length,
                        itemBuilder: (context, index) {
                          return Card(
                              elevation: 6.0,
                              child: Padding(
                                padding: const EdgeInsets.only(
                                    top: 6.0,
                                    bottom: 6.0,
                                    left: 8.0,
                                    right: 8.0),
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Text(snapshot
                                        .data.array.car[index].markName),
                                    Spacer(),
                                    Text(snapshot
                                        .data.array.car[index].id.toString()),
                                  ],
                                ),
                              ));
                        });
                  }
              }
            }));
  }
}