Home > Enterprise >  http 'POST' using an array not working properly in flutter
http 'POST' using an array not working properly in flutter

Time:10-02

I've created an array of list of objects along with strings. and in my API i tried to use post method. the post method writes on the server but when i try to read the value with my model it throws an error of Unhandled Exception: NoSuchMethodError: Class 'bool' has no instance method 'forEach'.. I'm using a complex JSON structure.

Model class

class Client {
  List<Clients>? clients;

  Client({required this.clients});

  Client.fromJson(Map<String, dynamic> json) {
    if (json['clients'] != null) {
      clients = <Clients>[];
      json['clients'].forEach((v) {
        clients?.add(new Clients.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.clients != null) {
      data['clients'] = this.clients!.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Clients {
  int? id;
  String? name;
  String? address;
  String? tinNo;
  String? status;
  String? createdAt;
  String? updatedAt;
  List<Phones>? phones;

  Clients(
      {this.id,
      this.name,
      this.address,
      this.tinNo,
      this.status,
      this.createdAt,
      this.updatedAt,
      this.phones});

  Clients.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
    address = json['address'];
    tinNo = json['tin_no'];
    status = json['status'];
    createdAt = json['created_at'];
    updatedAt = json['updated_at'];
    if (json['phones'] != null) {
      phones = <Phones>[];
      json['phones'].forEach((v) {
        phones!.add(new Phones.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['name'] = this.name;
    data['address'] = this.address;
    data['tin_no'] = this.tinNo;
    data['status'] = this.status;
    data['created_at'] = this.createdAt;
    data['updated_at'] = this.updatedAt;
    if (this.phones != null) {
      data['phones'] = this.phones!.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Phones {
  int? id;
  String? clientId;
  Null? supplierId;
  Null? companyId;
  String? phoneNumber;
  String? email;
  String? model;
  String? category;
  String? createdAt;
  String? updatedAt;

  Phones(
      {this.id,
      this.clientId,
      this.supplierId,
      this.companyId,
      this.phoneNumber,
      this.email,
      this.model,
      this.category,
      this.createdAt,
      this.updatedAt});

  Phones.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    clientId = json['client_id'];
    supplierId = json['supplier_id'];
    companyId = json['company_id'];
    phoneNumber = json['phone_number'];
    email = json['email'];
    model = json['model'];
    category = json['category'];
    createdAt = json['created_at'];
    updatedAt = json['updated_at'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['client_id'] = this.clientId;
    data['supplier_id'] = this.supplierId;
    data['company_id'] = this.companyId;
    data['phone_number'] = this.phoneNumber;
    data['email'] = this.email;
    data['model'] = this.model;
    data['category'] = this.category;
    data['created_at'] = this.createdAt;
    data['updated_at'] = this.updatedAt;
    return data;
  }
}

and my API call

Future createClient(String name, String address, String tin_no, String status,
    List<Phones> phones) async {
  Uri url = Uri.parse("${BASE_URL}client");
  ClientController clientController = Get.put(ClientController());

  final response = await http
      .post(url,
          headers: <String, String>{
            'Content-Type': 'application/json; charset=UTF-8',
            'Authorization': 'Bearer $TOKEN',
          },
          body: jsonEncode(<String, dynamic>{
            'name': name,
            'address': address,
            'tin_no': tin_no,
            'status': status,
            'phones': phones.toList()
          }))
      .then((value) {
    if (value.statusCode == 200) {
      clientController.setclientPress(true);
      print(Clients.fromJson(json.decode(value.body)));
      clientController.createClient(Clients.fromJson(json.decode(value.body)));
      Get.back();
      clientController.setclientPress(false);
      print("success");
    } else if (value.statusCode == 500) {
      Get.snackbar("Data Exists", "The data you provided already exists.");
    } else {
      print("failed ${value.body}");
      print("...............$phones");
    }
    print(value.body);
  });
}

button for calling

onPressed: () async {

   List<Phones> phones = [];
   for (int i = 0; i < _groupControllers.length; i  ) {
     String _phone = _groupControllers[i].phone.text;
     String _email = _groupControllers[i].email.text;
     String _category = "Reception";
     //_groupControllers[i].selectedCatagory.toString();

     setState(() {
      phones.add(Phones(
      phoneNumber: _phone,
      email: _email,
      category: _category));
     });
   }
  if (_formKey.currentState!.validate()) {
                      
     await createClient(
       nameController.text,
       addressController.text,
       tinController.text,
       idx.toString(),
       phones);
                      
     }
}

response is

    {
    "client": {
        "name": "trerw",
        "address": "trwrte",
        "tin_no": "45363524",
        "status": "1",
        "updated_at": "2022-10-01T12:44:19.000000Z",
        "created_at": "2022-10-01T12:44:19.000000Z",
        "id": 34
    },
    "phones": true,
    "message": "Client created successfully"
}

the phones should not return bool. it should be as follows

{
    "client": {
        "id": 1,
        "name": "Muhammed",
        "address": "Mexico",
        "tin_no": "123456789",
        "status": "1",
        "created_at": "2022-09-09T08:44:18.000000Z",
        "updated_at": "2022-09-09T08:44:18.000000Z",
        "phones": [
            {
                "id": 2,
                "client_id": "1",
                "supplier_id": null,
                "company_id": null,
                "phone_number": "0911112222",
                "email": "[email protected]",
                "model": "Client",
                "category": null,
                "created_at": "2022-09-09T08:44:18.000000Z",
                "updated_at": "2022-09-09T08:44:18.000000Z"
            }
        ]
    }
}

what am i doing wrong?

CodePudding user response:

As you can see in your api response:

{"client":{"name":"trerw","address":"trwrte","tin_no":"45363524","status":"1","updated_at":"2022-10-01T12:44:19.000000Z","created_at":"2022-10-01T12:44:19.000000Z","id":34},"phones":true,"message":"Client created successfully"}

phones is a bool variable, but in Clients.fromJson you consider it as list.So i think you send phones wrong in your api response.

Also you are passing phones in a wrong way to api body, try this:

body: jsonEncode(<String, dynamic>{
            'name': name,
            'address': address,
            'tin_no': tin_no,
            'status': status,
            'phones': phones.map((e) => e.toJson()).toList();
          }))
  • Related