Search code examples
node.jsflutterdartmodelfromjson

fromJSON method not being called in Flutter


I am trying to call this method but TempReceiptModel.fromJSON is not being called.

Future<TempReceiptModel?> getTempReceipt({
  required UserModel? user,
}) async {
  TempReceiptModel? tempReceipt;
  try {
    // print(tempReceipt.)
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String? accessToken = prefs.getString('accesstoken');
    String? userID = user?.user_id;
    http.Response res = await http.get(
      Uri.parse("http://localhost:3000/getTempReceipt/$userID"),
      headers: {
        "Authorization": "Bearer $accessToken",
      },
    );
    if (res.statusCode == 200) {
      Map<String, dynamic> Receipt = jsonDecode(res.body);
      tempReceipt = TempReceiptModel.fromJson(Receipt);
    }
    return tempReceipt;
  } catch (err) {
    return tempReceipt;
  }
}

Following is the code for TempReceiptModel

class TempReceiptModel {
  final String userID;
  final double tempWeight;
  var receipt;
  final String UID;

  TempReceiptModel({
    required this.userID,
    required this.tempWeight,
    required this.receipt,
    required this.UID,
  });

  static TempReceiptModel fromJson(Map<String, dynamic> json) {
    if(json['receipt']!=null ) {
      ReceiptObject.fromJson(json['receipt']);
    }
    return TempReceiptModel(
      userID: json['userID'],
      tempWeight: json['tempWeight'] ?? 0.0,
      receipt: json['receipt'],
      UID: json['UID'],
    );
  }

The fromJSON method calls ReceiptObject.fromJSON method. Following is the code for ReceiptObject model:

class ReceiptObject {
  final double totalWeight;
  final DateTime date;
  final double netTotal;
  final double totalDiscount;
  final double? gst;
  final bool isDeleted;
  final List<ItemModel> items;

  ReceiptObject({
    required this.totalWeight,
    required this.date,
    required this.netTotal,
    required this.totalDiscount,
    required this.isDeleted,
    required this.items,
    this.gst,
  });

  static ReceiptObject fromJson(Map<String, dynamic> json) {
    return ReceiptObject(
      totalWeight: json['totalWeight'],
      date: DateTime.parse(json['date']),
      netTotal: json['netTotal'],
      totalDiscount: json['totalDiscount'],
      gst: json['gst'],
      isDeleted: json['isDeleted'],
      items: (json['items'] as List<dynamic>)
          .map((e) => ItemModel.fromJson(e))
          .toList(),
    );
  }

Following is the itemModel and itemModel.fromJSON method

class ItemModel {
 final String productID;
 final int productQuantity;
 final double grossTotal;
  bool isDeleted=false;


  ItemModel(
      {
        required this.productID,
        required this.grossTotal,
        required this.productQuantity,
        required this.isDeleted,

      });

  static ItemModel fromJson(Map<String, dynamic> json) {
    return ItemModel(
        productID :json["productID"],
        grossTotal: json["grossTotal"],
        productQuantity:json["productQuantity"],
        isDeleted:json["isDeleted"]

    );
  }


Map<String, dynamic> toJson() {
  final Map<String, dynamic> data = new Map<String, dynamic>();
  data['productID']=this.productID;
  data['productQuantity']=this.productQuantity;
  data['grossTotal']=this.grossTotal;
  data['isDeleted']=this.isDeleted;
  return data;
}

}

The models are saved in the backend as follows

const mongoose = require('mongoose');
const receiptSchema = require('./receipt_model');

var tempReceiptSchema = new mongoose.Schema({
    userID: {
        type: String,
        required: true,
        unique: true
    },
    tempWeight: {
        type: Number,
        default: 0
    },
    receipt: {
        totalWeight: {
            type: Number,
            default: 0,
            required: true
        },
        date: {
            type: Date,
            default: Date.now(),
            required: true
        },
        netTotal: {
            type: Number,
            default: 0,
            required: true
        },
        totalDiscount: {
            type: Number,
            default: 0,
            required: true
        },
        gst: {
            type: Number,
        },
        isDeleted: {
            type: Boolean,
            default: false
        },
        items: [{
            productID: {
                type: String,
                required: true
            },
            productQuantity: {
                type: Number,
                required: true
            },
            grossTotal: {
                type: Number,
                required: true
            },
            // for soft delete
            isDeleted: {
                type: Boolean,
                default: false
            }
        }]
    },
    UID: {
        type: String,
        required: true
    }
})

const receipt = mongoose.model('tempReceipt', tempReceiptSchema)
module.exports = receipt

I receive this object as the respone:

{
"tempreceipt": {
    "receipt": {
        "totalWeight": 0.30000000000000004,
        "date": "2023-04-07T17:50:44.898Z",
        "netTotal": 540,
        "totalDiscount": 0,
        "isDeleted": false,
        "items": [
            {
                "productID": "63b2d175525a0799637150bc",
                "productQuantity": 3,
                "grossTotal": 540,
                "isDeleted": false,
                "_id": "64305818becb25d9ae1a6801"
            }
        ]
    },
    "_id": "643057ffbecb25d9ae1a67f0",
    "userID": "641f4d6a11a2885a78550113",
    "tempWeight": 0,
    "UID": " D9 B9 B1 D5",
    "__v": 1
}

}

I want the TempReceiptModel to be returned from TempReceipt.fromJSON method.


Solution

  • I changed my TempReceiptModel fromJSON method to this:

    return TempReceiptModel(
      receipt: ReceiptObject.fromJson(json['tempreceipt']['receipt']),
      userID: json['tempreceipt']['userID'],
      tempWeight: json['tempreceipt']['tempWeight'].toDouble(),
      uid: json['tempreceipt']['UID'],
    );
    

    I did not change the rest of the code and it worked.