Freezed: Generate method use in JsonKey(fromJson)

Created on 20 Mar 2020  路  6Comments  路  Source: rrousselGit/freezed

One of my field use fromJson property from JsonKey annotation, but the method is not actually generated inside *.freezed.dart file.

Is this property not supported or i use it incorrectly?

My class

@immutable
abstract class RegistrationHistoryData with _$RegistrationHistoryData {
  const factory RegistrationHistoryData(
    @JsonKey(name: 'RegistrationNo') final String registrationNo,
    @JsonKey(name: 'SRRegistrationType', fromJson: _registrationNameFromType)
        final String registrationType,
    @JsonKey(name: 'RegistrationDate_yMdHms') final String registrationDate,
    @JsonKey(name: 'RegistrationTime') final String registrationTime,
    @JsonKey(name: 'RegistrationQue') final int que,
    @JsonKey(name: 'ActualVisitDate_yMdHms') final String actualVisitDate,
    @JsonKey(name: 'AppointmentNo') final String appoitmentNo,
    @JsonKey(name: 'FromRegistrationNo') final String fromRegistrationNo,
    @JsonKey(name: 'ParamedicID') final String doctorId,
    @JsonKey(name: 'ParamedicName') final String doctorName,
    @JsonKey(name: 'ServiceUnitID') final String unitId,
    @JsonKey(name: 'ServiceUnitName') final String unitName,
    @JsonKey(name: 'GuarantorID') final String guarantorId,
    @JsonKey(name: 'GuarantorName') final String guarantor,
    @JsonKey(name: 'VisitTypeID') final String visitTypeId,
    @JsonKey(name: 'VisitTypeName') final String visitType,
    @JsonKey(name: 'Notes') final String notes,
    @JsonKey(name: 'DiagnoseID') final String diagnoseId,
    @JsonKey(name: 'DiagnoseText') final String diagnose,
    @JsonKey(name: 'DischargeDate_yMdHms') final String dischargeDate,
    @JsonKey(name: 'DischargeTime') final String dischargeTime,
    @JsonKey(name: 'DischargeNotes') final String dischargeNotes,
    @JsonKey(name: 'DischargeMedicalNotes') final String dischargeMedicalNotes,
  ) = _RegistrationHistoryData;

  static String _registrationNameFromType(String type) {
    switch (type) {
      case 'EMR':
        return 'Emergency';
        break;
      case 'OPR':
        return 'Rawat Jalan';
        break;
      case 'IPR':
        return 'Rawat Inap';
        break;
      default:
        return null;
    }
  }

  factory RegistrationHistoryData.fromJson(Map<String, dynamic> json) =>
      _$RegistrationHistoryDataFromJson(json);
}
bug

All 6 comments

Since you are using the @immutable decorator, are you using an outdated version?

Ah yes im using outdated version but then after reading your reply i updated the package to version 0.10.3 and change the annotation to @freezed

But even after that and rebuilding my class i still got Undefined name '_registrationNameFromType'. error in the generated file

Updated class

@freezed
abstract class RegistrationHistoryData with _$RegistrationHistoryData {
  @JsonSerializable(explicitToJson: true)
  const factory RegistrationHistoryData(
    @JsonKey(name: 'RegistrationNo') final String registrationNo,
    @JsonKey(name: 'SRRegistrationType', fromJson: _registrationNameFromType)
        final String registrationType,
    @JsonKey(name: 'RegistrationDate_yMdHms') final String registrationDate,
    @JsonKey(name: 'RegistrationTime') final String registrationTime,
    @JsonKey(name: 'RegistrationQue') final int que,
    @JsonKey(name: 'ActualVisitDate_yMdHms') final String actualVisitDate,
    @JsonKey(name: 'AppointmentNo') final String appoitmentNo,
    @JsonKey(name: 'FromRegistrationNo') final String fromRegistrationNo,
    @JsonKey(name: 'ParamedicID') final String doctorId,
    @JsonKey(name: 'ParamedicName') final String doctorName,
    @JsonKey(name: 'ServiceUnitID') final String unitId,
    @JsonKey(name: 'ServiceUnitName') final String unitName,
    @JsonKey(name: 'GuarantorID') final String guarantorId,
    @JsonKey(name: 'GuarantorName') final String guarantor,
    @JsonKey(name: 'VisitTypeID') final String visitTypeId,
    @JsonKey(name: 'VisitTypeName') final String visitType,
    @JsonKey(name: 'Notes') final String notes,
    @JsonKey(name: 'DiagnoseID') final String diagnoseId,
    @JsonKey(name: 'DiagnoseText') final String diagnose,
    @JsonKey(name: 'DischargeDate_yMdHms') final String dischargeDate,
    @JsonKey(name: 'DischargeTime') final String dischargeTime,
    @JsonKey(name: 'DischargeNotes') final String dischargeNotes,
    @JsonKey(name: 'DischargeMedicalNotes') final String dischargeMedicalNotes,
  ) = _RegistrationHistoryData;

  static String _registrationNameFromType(String type) {
    switch (type) {
      case 'EMR':
        return 'Emergency';
        break;
      case 'OPR':
        return 'Rawat Jalan';
        break;
      case 'IPR':
        return 'Rawat Inap';
        break;
      default:
        return null;
    }
  }

  factory RegistrationHistoryData.fromJson(Map<String, dynamic> json) =>
      _$RegistrationHistoryDataFromJson(json);
}

Oh, I misunderstood the error.
It sounds related to https://github.com/rrousselGit/freezed/issues/123, where the cause is the static.

If you extract _registrationNameFromType as a top-level function inside of using static, that should work.

If you extract _registrationNameFromType as a top-level function inside of using static, that should work.

Yup extracting the function as a top-level function does the job, i did a simple unit test and it all worked as expected.

Thankyou for the help!

@rrousselGit It that info (top-level function about custom methods) a tip to be referenced in the documentation? Got the same problem until finding this "issue". If so, I will submit a PR.

Sure go ahead

Was this page helpful?
0 / 5 - 0 ratings

Related issues

matiasosuna picture matiasosuna  路  4Comments

vedantrathore picture vedantrathore  路  6Comments

jonasbark picture jonasbark  路  3Comments

samandmoore picture samandmoore  路  4Comments

orestesgaolin picture orestesgaolin  路  6Comments