簡體   English   中英

Flutter:未處理的異常:將對象轉換為可編碼對象失敗:“AddProjectModel”的實例

[英]Flutter: Unhandled Exception: Converting object to an encodable object failed: Instance of 'AddProjectModel'

每次我嘗試向 API 發送數據時,都會出現以下錯誤:

未處理的異常:將對象轉換為可編碼對象失敗:'AddProjectModel' 的實例”。

我一步一步跟着調試器,一切順利,所有數據都正確傳遞。 但是,當它到達 jsonEncode() 方法時,它會給出上述錯誤。

任何人都可以幫忙,在此先感謝。

這是我的 AddProjectModel 和其中使用的其他模型:

class AddProjectModel {
  AddProjectModel({
    required this.name,
    required this.city,
    required this.district,
    required this.address,
    required this.size,
    required this.completionDate,
    required this.infrastructureCost,
    required this.currencyID,
    required this.description,
    required this.isHidden,
    required this.companies,
    required this.facilities,
    required this.picture,
  });
  late final String name;
  late final String city;
  late final String district;
  late final String address;
  late final double size;
  late final DateTime completionDate;
  late final double infrastructureCost;
  late final int currencyID;
  late final String description;
  late final bool isHidden;
  late final List<AddProjectCompaniesModel> companies;
  late final List<AddEditFacilitiesModel> facilities;
  late final List<AddProjectPicturesModel> picture;

  AddProjectModel.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    city = json['city'];
    district = json['district'];
    address = json['address'];
    size = json['size'].toDouble();
    completionDate = json['completeDate'];
    infrastructureCost = json['infrastructureCost'].toDouble();
    currencyID = json['currencyID'];
    description = json['description'];
    isHidden = json['isHidden'];
    companies = List.from(json['companies'])
        .map((e) => AddProjectCompaniesModel.fromJson(e))
        .toList();
    facilities = List.from(json['facilities'])
        .map((e) => AddEditFacilitiesModel.fromJson(e))
        .toList();
    picture = List.from(json['picture'])
        .map((e) => AddProjectPicturesModel.fromJson(e))
        .toList();
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['name'] = name;
    data['city'] = city;
    data['district'] = district;
    data['address'] = address;
    data['size'] = size;
    data['completeDate'] = completionDate;
    data['infrastructureCost'] = infrastructureCost;
    data['currencyID'] = currencyID;
    data['description'] = description;
    data['isHidden'] = isHidden;
    data['companies'] = companies.map((e) => e.toJson()).toList();
    data['facilities'] = facilities.map((e) => e.toJson()).toList();
    data['picture'] = picture.map((e) => e.toJson()).toList();
    return data;
  }
}

class AddProjectCompaniesModel {
  AddProjectCompaniesModel({
    required this.companyId,
  });
  late final int companyId;

  AddProjectCompaniesModel.fromJson(Map<String, dynamic> json) {
    companyId = json['companyId'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['companyId'] = companyId;
    return data;
  }
}

class AddEditFacilitiesModel {
  AddEditFacilitiesModel({
    required this.pool,
    required this.gym,
    required this.garage,
    required this.garden,
    required this.roofRoom,
    required this.barbecuePlace,
    required this.cafeterias,
    required this.giftShop,
    required this.gamingCenter,
    required this.supermarket,
    required this.atm,
    required this.playGround,
    required this.parking,
    required this.walkingArea,
    required this.pharmacy,
    required this.dryCleaning,
    required this.spaCenter,
    required this.medicalServices,
  });

  late final bool pool;
  late final bool gym;
  late final bool garage;
  late final bool garden;
  late final bool roofRoom;
  late final bool barbecuePlace;
  late final bool cafeterias;
  late final bool giftShop;
  late final bool gamingCenter;
  late final bool supermarket;
  late final bool atm;
  late final bool playGround;
  late final bool parking;
  late final bool walkingArea;
  late final bool pharmacy;
  late final bool dryCleaning;
  late final bool spaCenter;
  late final bool medicalServices;

  AddEditFacilitiesModel.fromJson(Map<String, dynamic> json) {
    pool = json['pool'];
    gym = json['gym'];
    garage = json['garage'];
    garden = json['garden'];
    roofRoom = json['roofRoom'];
    barbecuePlace = json['barbecuePlace'];
    cafeterias = json['cafeterias'];
    giftShop = json['giftShop'];
    gamingCenter = json['gamingCenter'];
    supermarket = json['superMarket'];
    atm = json['atm'];
    playGround = json['playGround'];
    parking = json['parking'];
    walkingArea = json['walkingArea'];
    pharmacy = json['pharmacy'];
    dryCleaning = json['drycleaning'];
    spaCenter = json['spacenter'];
    medicalServices = json['medicalservices'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['pool'] = pool;
    data['gym'] = gym;
    data['garage'] = garage;
    data['garden'] = garden;
    data['roofRoom'] = roofRoom;
    data['barbecuePlace'] = barbecuePlace;
    data['cafeterias'] = cafeterias;
    data['giftShop'] = giftShop;
    data['gamingCenter'] = gamingCenter;
    data['superMarket'] = supermarket;
    data['atm'] = atm;
    data['playGround'] = playGround;
    data['parking'] = parking;
    data['walkingArea'] = walkingArea;
    data['pharmacy'] = pharmacy;
    data['drycleaning'] = dryCleaning;
    data['spacenter'] = spaCenter;
    data['medicalservices'] = medicalServices;
    return data;
  }
}

class AddProjectPicturesModel {
  AddProjectPicturesModel({
    this.url,
    required this.file,
    this.dateAdded,
  });
  late String? url;
  late final String file;
  late String? dateAdded;

  AddProjectPicturesModel.fromJson(Map<String, dynamic> json) {
    url = json['url'];
    file = json['file'];
    dateAdded = json['dateAdded'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['url'] = url;
    data['file'] = file;
    data['dateAdded'] = dateAdded;
    return data;
  }
}

這是我將數據發布到 API 的 addProject() 方法:

static Future<bool> addProject(
    String name,
    String city,
    String district,
    String address,
    double size,
    DateTime completionDate,
    double infrastructureCost,
    int currencyID,
    String description,
    bool isHidden,
    List<AddProjectCompaniesModel> companies,
    List<AddEditFacilitiesModel> facilities,
    List<AddProjectPicturesModel> projectPicture,
  ) async {
    AddProjectModel projectModel = AddProjectModel(
      name: name,
      city: city,
      district: district,
      address: address,
      size: size,
      completionDate: completionDate,
      infrastructureCost: infrastructureCost,
      currencyID: currencyID,
      description: description,
      isHidden: isHidden,
      companies: companies,
      facilities: facilities,
      picture: projectPicture,
    );

    final url = Uri.https(APIRoutes.baseURL, APIRoutes.project);

    Map<String, String> requestHeaders = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ${secureStorage.token}',
    };

    final response = await client.post(
      url,
      headers: requestHeaders,
      body: jsonEncode(projectModel),
    );

    if (response.statusCode == 201) {
      print('Success with: ${response.statusCode}');
      return true;
    } else {
      print('Failed with: ${response.statusCode}');
      return false;
    }
  }

那是因為 dart 對象默認是不能轉換成 json 的,你需要先把它轉換成Map或者你可以使用插件把你的對象轉換成json_serializable 之類的映射

問題是通過“dart:convert 庫支持”的 jsonEncode() 方法將對象轉換為可編碼對象時失敗。

這是 jsonEncode() 方法的 Flutter 解釋

如上圖所示,我們只允許轉換“數字、布爾值、字符串、空值、列表或帶有字符串鍵的映射”類型的值。 因此,我的問題中的問題不在以下對象中:

    List<AddProjectCompaniesModel> companies
    List<AddEditFacilitiesModel> facilities
    List<AddProjectPicturesModel> projectPicture

因為這些是 List 類型,它們沒有問題。 但是,問題出在以下代碼行中

    DateTime completionDate, // inside addProject(...)
    late final DateTime completionDate; // inside AddProjectModel{}
    data['completeDate'] = completionDate; // inside toJson() of AddProjectModel{}

我正在嘗試轉換 DateTime 類型的值,但不允許這樣做,如上圖中的方法說明所示。 因此,我必須先將 completionDate 變量從“DateTime”轉換為“String”,然后再將其轉換為 json 格式。 之后它工作正常。

因此,解決方案是更改這行代碼

    data['completeDate'] = completionDate; // inside toJson() of AddProjectModel{}

    data['completeDate'] = completionDate.toString();

我希望我的回答得到了足夠的解釋。 您可以在下面查看整個更正后的代碼。

AddProjectModel 和其中使用的其他模型:

class AddProjectModel {
  AddProjectModel({
    required this.name,
    required this.city,
    required this.district,
    required this.address,
    required this.size,
    required this.completionDate,
    required this.infrastructureCost,
    required this.currencyID,
    required this.description,
    required this.isHidden,
    required this.companies,
    required this.facilities,
    required this.picture,
  });
  late final String name;
  late final String city;
  late final String district;
  late final String address;
  late final double size;
  late final DateTime completionDate;
  late final double infrastructureCost;
  late final int currencyID;
  late final String description;
  late final bool isHidden;
  late final List<AddProjectCompaniesModel> companies;
  late final List<AddEditFacilitiesModel> facilities;
  late final List<AddProjectPicturesModel> picture;

  AddProjectModel.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    city = json['city'];
    district = json['district'];
    address = json['address'];
    size = json['size'].toDouble();
    completionDate = json['completeDate'];
    infrastructureCost = json['infrastructureCost'].toDouble();
    currencyID = json['currencyID'];
    description = json['description'];
    isHidden = json['isHidden'];
    companies = List.from(json['companies'])
        .map((e) => AddProjectCompaniesModel.fromJson(e))
        .toList();
    facilities = List.from(json['facilities'])
        .map((e) => AddEditFacilitiesModel.fromJson(e))
        .toList();
    picture = List.from(json['picture'])
        .map((e) => AddProjectPicturesModel.fromJson(e))
        .toList();
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['name'] = name;
    data['city'] = city;
    data['district'] = district;
    data['address'] = address;
    data['size'] = size;
    data['completeDate'] = completionDate.toSting(); //Only this line changed
    data['infrastructureCost'] = infrastructureCost;
    data['currencyID'] = currencyID;
    data['description'] = description;
    data['isHidden'] = isHidden;
    data['companies'] = companies.map((e) => e.toJson()).toList();
    data['facilities'] = facilities.map((e) => e.toJson()).toList();
    data['picture'] = picture.map((e) => e.toJson()).toList();
    return data;
  }
}

class AddProjectCompaniesModel {
  AddProjectCompaniesModel({
    required this.companyId,
  });
  late final int companyId;

  AddProjectCompaniesModel.fromJson(Map<String, dynamic> json) {
    companyId = json['companyId'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['companyId'] = companyId;
    return data;
  }
}

class AddEditFacilitiesModel {
  AddEditFacilitiesModel({
    required this.pool,
    required this.gym,
    required this.garage,
    required this.garden,
    required this.roofRoom,
    required this.barbecuePlace,
    required this.cafeterias,
    required this.giftShop,
    required this.gamingCenter,
    required this.supermarket,
    required this.atm,
    required this.playGround,
    required this.parking,
    required this.walkingArea,
    required this.pharmacy,
    required this.dryCleaning,
    required this.spaCenter,
    required this.medicalServices,
  });

  late final bool pool;
  late final bool gym;
  late final bool garage;
  late final bool garden;
  late final bool roofRoom;
  late final bool barbecuePlace;
  late final bool cafeterias;
  late final bool giftShop;
  late final bool gamingCenter;
  late final bool supermarket;
  late final bool atm;
  late final bool playGround;
  late final bool parking;
  late final bool walkingArea;
  late final bool pharmacy;
  late final bool dryCleaning;
  late final bool spaCenter;
  late final bool medicalServices;

  AddEditFacilitiesModel.fromJson(Map<String, dynamic> json) {
    pool = json['pool'];
    gym = json['gym'];
    garage = json['garage'];
    garden = json['garden'];
    roofRoom = json['roofRoom'];
    barbecuePlace = json['barbecuePlace'];
    cafeterias = json['cafeterias'];
    giftShop = json['giftShop'];
    gamingCenter = json['gamingCenter'];
    supermarket = json['superMarket'];
    atm = json['atm'];
    playGround = json['playGround'];
    parking = json['parking'];
    walkingArea = json['walkingArea'];
    pharmacy = json['pharmacy'];
    dryCleaning = json['drycleaning'];
    spaCenter = json['spacenter'];
    medicalServices = json['medicalservices'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['pool'] = pool;
    data['gym'] = gym;
    data['garage'] = garage;
    data['garden'] = garden;
    data['roofRoom'] = roofRoom;
    data['barbecuePlace'] = barbecuePlace;
    data['cafeterias'] = cafeterias;
    data['giftShop'] = giftShop;
    data['gamingCenter'] = gamingCenter;
    data['superMarket'] = supermarket;
    data['atm'] = atm;
    data['playGround'] = playGround;
    data['parking'] = parking;
    data['walkingArea'] = walkingArea;
    data['pharmacy'] = pharmacy;
    data['drycleaning'] = dryCleaning;
    data['spacenter'] = spaCenter;
    data['medicalservices'] = medicalServices;
    return data;
  }
}

class AddProjectPicturesModel {
  AddProjectPicturesModel({
    this.url,
    required this.file,
    this.dateAdded,
  });
  late String? url;
  late final String file;
  late String? dateAdded;

  AddProjectPicturesModel.fromJson(Map<String, dynamic> json) {
    url = json['url'];
    file = json['file'];
    dateAdded = json['dateAdded'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['url'] = url;
    data['file'] = file;
    data['dateAdded'] = dateAdded;
    return data;
  }
}

將數據發布到 API 的 addProject() 方法:

static Future<bool> addProject(
    String name,
    String city,
    String district,
    String address,
    double size,
    DateTime completionDate,
    double infrastructureCost,
    int currencyID,
    String description,
    bool isHidden,
    List<AddProjectCompaniesModel> companies,
    List<AddEditFacilitiesModel> facilities,
    List<AddProjectPicturesModel> projectPicture,
  ) async {
    AddProjectModel projectModel = AddProjectModel(
      name: name,
      city: city,
      district: district,
      address: address,
      size: size,
      completionDate: completionDate,
      infrastructureCost: infrastructureCost,
      currencyID: currencyID,
      description: description,
      isHidden: isHidden,
      companies: companies,
      facilities: facilities,
      picture: projectPicture,
    );

    final url = Uri.https(APIRoutes.baseURL, APIRoutes.project);

    Map<String, String> requestHeaders = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ${secureStorage.token}',
    };

    final response = await client.post(
      url,
      headers: requestHeaders,
      body: jsonEncode(projectModel),
    );

    if (response.statusCode == 201) {
      print('Success with: ${response.statusCode}');
      return true;
    } else {
      print('Failed with: ${response.statusCode}');
      return false;
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM